集群上的可用带宽限制了MapReduce作业的数量,因此尽量避免map和reduce任务之间的数据传输是有利的。Hadoop允许用户针对map任务的输出指定一个combiner(类似与map和reduce)——combiner函数的输出作为reduce函数的输入。
combiner的规则制约着可用的函数类型。这里还是以计算最高气温的例子来说明,假设第一个map的输出如下:
(1950,0)
(1950,10)
(1950,20)
第二个map的输出如下:
(1950,25)
(1950,15)
reduce函数被调用时,输入如下:
(1950,[0,20,10,25,15])
而先使用combiner找出每个map任务输出结果中的最气温,这样reduce函数调用时将传入以下数据:
(1950,[20,25])
输出结果都为(1950,25)。
并非所有的函数都具有该属性,例如计算平均气温时,就不能用平均数作为combiner。
但是combiner不能取代reduce函数,因为我们仍然需要reduce函数来处理不同map输出其中具有相同键的记录,但它能有效减少mapper和reducer之间的数据传输量,需要谨慎使用。