combiner函数与reduce函数形式相同,但不同之处在于它的输出类型是中间的键值(key,value)对类型,这些中间值最终会输入给reduce函数,map会产生大量本地输入,但map函数不会对键值对做合并,例如统计单词dog的数量:
Map:
dog 1
dog 1
dog 1
dog 1
Map阶段,某个Map执行完毕传给Reduce的参数为dog{1,1,1,1},values中的值为4个,而如果添加combiner函数,其会实现本地相同key的合并,并对map输出key进行排序,因此最终传给reduce的键值对是dog{4},因此这样可以减少map传给reduce的数据数量,这是MapReduce的一种优化手段。
需要注意:combiner与Mapper和Reduced不同,没有默认实现,只有满足结合律才可以,求最大、求和可以,但求平均不可以。即combiner是可插可拔的,绝不能改变最终的结果。故其只能用于Reduce的输入键值对和输出键值对完全一样的情况。