Combiner 组件的作用
MapReduce 中的 Combiner 组件就是为了避免 MapTask 任务和 ReduceTask 任务之间的过多的数据传输而设置的
- MapReduce 程序可以在 MapTask 阶段自定义一个 Combiner 组件进行聚合
- Combiner 的工作机制类似于 Reducer,不同的是只针对一个 MapTask 任务进行聚合(局部聚合)
- Combiner 组件可以削减 Mapper 的输出,减少传输到 Reduce中的数据量
- Combiner 组件可以减少网络带宽和 Reducer 的运算负载
设置 Combiner 组件
// 设置maptask端的 局部聚合 Combiner 组件
job.setCombinerClass(MyCombiner.class);
Combiner 组件使用注意事项
- Combiner 组件没有默认实现,必须用户自定义
- 并不是所有的 Job 都适用使用 Combiner 组件,只有操作满足结合律的才可以
- 一般情况 Combiner 组件和 Reducer 进行同样的操作
数据倾斜问题解决方案
步骤一:第一次在 Map 阶段对那些导致了数据倾斜的 Key 加上分区号随机值,这样本来相同的 Key 也会被分到多个 ReduceTask 任务中进行
步骤二:使用 Combiner 组件进行局部聚合,减少传输到 ReducerTask 的数据量,减轻 ReducerTask 的处理压力,节约网络带宽
注:增加ReducerTask 并行度,或者实现自定义分区,将 Key 均匀分配到不同Reducer