job.setCombinerClass(MyReduce.class);//规约操作,形参是自定义的Reducer类
问:为什么使用Combiner?
答:Combiner发生在Map端,对数据进行规约处理,数据量变小了,传送到reduce端的数据量变小了,传输时间变短,作业的整体时间变短。问:为什么Combiner不作为MapperReduce运行的标配,而是可选步骤呢?
答:因为不是所有的算法都适合使用Combiner处理,例如求平均数。
问:Combiner本身已经执行了reduce操作,为什么在Reducer阶段还要执行reduce操作呢?
答:combiner操作发生在map端的,处理一个任务所接收的文件中的数据,不能跨map任务执行;只有reduce可以接收多个map任务处理的数据。
例如有两个文件,每个文件中都有
hello you
hello me
一个map任务读取一个文件,当一个map任务执行完后输出的是(包含Combiner操作)<hello,2><you,1><me,1>
而我们最终希望获取的是<hello,4><you,2><me,2>,所以说Combiner并不能完成Reducer的工作!因为Combiner只能处理一个任务所接收的文件中的数据,不能跨map任务执行。