combiner优化

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);
	}
}

猜你喜欢

转载自blog.csdn.net/m0_37746551/article/details/87834421