一、什么是 Combiner?
作用:在 MapTask 之后给 MapTask 的结果进行局部汇总以减轻 ReduceTask 的计算负载,减少网络传输
每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,以减少在map和reduce节点之间的数据传输量,以提高网络IO性能,是MapReduce的一种优化手段之一
Combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。有本地 Reduce 之称
------------实际上就是继承Reducer类,本质上就是一个Reducer
二、数据格式的转换
map: (K1, V1) → list(K2, V2)
combiner: (K2, list(V2)) → list(K3, V3)
reduce: (K3, list(V3)) → list(K4, V4)
数据转换流程图:
三添加设置 Combiner 的代码
1、具体实现步骤
(1)自定义一个 Combiner 继承 Reducer,重写 reduce 方法
(2)在 Job 中设置: job.setCombinerClass(xxx.class)
具体代码实现:
(1)Combiner 的代码和 reduce 端的代码一致,本质上就是一个 Reducer
(2)在 job 中设置 Combiner 类
// 指定combiner
job.setCombinerClass(WordCountReducer.class);
使用 Combiner 的注意事项
(1)运行位置
Combiner 是在每一个 MapTask 所在的节点运行
Reducer 是接收全局所有 Mapper 的输出结果
(2)Combiner 的输出 KV 跟 Reducer 的输入 KV 类型相对应
(3)Combiner 使用的原则是:有或没有都不能影响业务逻辑,都不能影响最终结果。
(4)适用场景:汇总统计;不适用场景:求平均数适用于Reduce的输入key/value与输出key/value类型完全一致情况
如果你看不懂请参考:Hadoop学习笔记—8.Combiner与自定义Combiner特详细
参考资料
(1)Suddenly,《Hadoop日记Day17-计数器、map规约与分区学习》
(2)guoery,《MapReduce中Combiner的使用及误区》
(3)iPolaris,《Hadoop中Combiner的使用》