Combiner 会对每一个 MapTask 的输出进行局部汇总,以减少 IO 传输,提高程序的执行效率。但是使用时必须不能影响原有的业务处理结果。
1. 求和,求加减的时候可以使用 combiner,减少 map 的输出,缓解网络 IO
2. 求平均值,求乘除的时候就不能使用 combiner,因为 combiner 的时候会使用 reduce 的逻辑,先行求了平均值,导致与业务原有的处理结果不一致。
知识补充:
1.Combiner 不能用于求数据的平均值,因为统计前和统计后进行除法会有误。但可以用于数据的加减,因为统计前和统计后不会对加减造成影响。
- 如果程序中没有了 Reduce 的话,那就别设置 Combiner 了,因为 shuffle 是在 map 输出和 reduce 输入之间的,没有 reduce 的话,数据直接就从 map 输出了,不会有 shuffle 的阶段。
- 实际上,reduce 就相当于 Combiner 了,reduce 的功能和 Combiner 的功能是一样的,所以直接调用 reduce 就可以完成 Combiner 的合并过程:job.setCombinerClass (wordCountReducer.class)