Hadoop学习之路(八) MapReduce框架Combiner分区

对combiner的理解

combiner其实属于优化方案,由于带宽限制,应该尽量减少map和reduce之间的数据传输数量。它在Map端把同一个key的键值对合并到一起并计算,计算规则与reduce一致所以combiner也可以看做特殊的Reducer.
执行combiner操作要求开发者在程序中设置了combiner(程序中通过job.setCombinerClass(MyCombiner.class)自定义combiner操作)。
Combiner组件是用来做局部汇总的,就在mapTask中进行汇总;Reducer组件是用来做全局汇总的,最终的,最后一次汇总。

combiner的使用场景

1、map输出数据根据分组排序完成后,在写入文件之前会执行一次combine操作(前提是作业中设置了这个操作);

# 此处可以将Reducer作为conbiner,因为输入输出的key-value相同
job.setCombinerClass(WordCountReducer.class);

2、如果map输出比较大,溢出文件个数大于3(此值可以通过属性min.num.spills.for.combine配置时),在merge的过程(多个spill文件合并为一个大文件)中前还会执行combiner操作。

注意事项

不是所有的作业都可以做combiner操作的,只有满足以下条件才可以:
1、Combiner只能对一个mapTask的中间结果进行汇总;
2、如果想使用Reducer直接充当Combiner,那么必须满足:Reducer的输入和输出key-value类型是一致的。

  • 处于两个不同节点的mapTask的结果不能combiner到一起;
  • 处于同一节点的两个mapTask的结果不能combiner到一起;
  • 求最大数、最小数、求和、去重时可以直接使用Reducer充当Combiner,但是求平均值时不可以使用Reducer充当Combiner.
    原因: 对2组值求平均值
    2 3 4 5 6 = 20 / 5 = 4
    4 5 6 = 15 / 3 = 5

(20+15)/ (5+3) = 4.5

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。