• 核心意义 :减少集群之间的网络开销
  • 具体实现步骤

  • 1.自定义一个Combiner 继承 reduce 重写reduce方法
  • 2.在 job 中设置:job.setCombinerClass(Combiner类.class)


注意:


combiner 能够应用的前提是不能影响最终的业务逻辑,而且,combiner 的输出 kv 应该跟 reducer 的输入 kv 类型要对应起来


不适用的场景:


求平均数 会出现 最终数据不一致的问题


为什么要用Combiner


  • 每一个map 都有可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,以减少map和reduce节点之间的数据传输量,以提高网络IO性能,是MapReduce的一种优化手段之一.
  • Combiner 是 MR程序中 mapper 和Reduce 之外的一种组件
  • Combinner 组件的父类就是Reducer
  • Combinner和Reduce的区别在于运行的位置
  • Combinner是在每一个maptask所在的节点运行Reducer 是接受全局所有mapper的输出结果
  • Combinner的意义就是对每一个maptask的输出进行局部汇总,以减少网络传输量

图解Combinner

未使用combiner的网络开销

MapReduce的Combiner详解_网络传输

使用combiner的网络开销

MapReduce的Combiner详解_Combinner_02