combiner为何物
1. Combiner是MR程序中Mapper和Reduce之外的一种组件
2. Combiner组件的父类是Reducer
3. Combiner和Reducer之间的区别在于运行的位置,Combiner可以看做局部的Reducer(local reducer)
4. Reducer接收全局的MapTask 所输出的结果
5. Combiner在MapTask节点中运行
6. map产生大量的本地输出时,Combiner可以对map输出的结果先做一次合并,以减少map和reduce之间的数据
传输量,提高当前网络IO传输的性能,进而优化mapreduce传输量,提高当前网络IO传输的性能,
进而优化mapreduce
7. Combiner在Job中是如下设置的:job.setCombinerClass(Reducer.class);
8. Combiner一般情况下,默认使用Reducer的实现(惊不惊喜,意不意外,一行代码解决优化),
前提是combiner和reduce方法功能一样
Combiner的使用场景
并不是所有的场景都可以使用Combiner,必须不影响业务逻辑。
比如,适合于Sum()求和,并不适合Average()求平均数。
看此例,求 0、20、10 25和15的平均数,直接使用Reduce求平均数Average(0,20,10,25,15),得到的结
果是14, 如果先使用Combiner分别对不同Mapper结果求平均数,Average(0,20,10)=10,Average(25,15)=20,
再使用Reducer求平均数Average(10,20),得到的结果为15,结果错误。
拿WordCount例子来举例,前面已经写过,链接如下:
https://blog.csdn.net/m0_37746551/article/details/87782792
优化只需在Driver类多加一行代码
public class WordCountDriver {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
//1.获取job信息
Configuration conf = new Configuration();
Job job = Job.getInstance(conf);
//2.获取jar包
job.setJarByClass(WordCountDriver.class);
//3.获取自定义的mapper和reducer类
job.setMapperClass(WordCountMapper.class);
job.setReducerClass(WordCountReducer.class);
//4.设置map输出的数据类型
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(IntWritable.class);
//5.设置reduce输出的数据类型(最终的数据类型)
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(IntWritable.class);
//添加combiner
job.setCombinerClass(WordCountReducer.class);
//6.设置数据存在的路径与处理后的结果路径
FileInputFormat.setInputPaths(job, new Path("C:/BIGDATA/Test/sin"));
FileOutputFormat.setOutputPath(job,new Path("C:/BIGDATA/Test/sout"));
//7.提交任务
boolean rs = job.waitForCompletion(true);
System.out.println(rs?0:1);
}
}