码迷,mamicode.com
首页 > 其他好文 > 详细

MapReducer中的多次归约处理

时间:2015-07-28 10:55:06      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:mapreduce   归约处理   hadoop   

我们知道,MapReduce是分为Mapper任务和Reducer任务,Mapper任务的输出,通过网络传输到Reducer任务端,作为输入。

在Reducer任务中,通常做的事情是对数据进行归约处理。既然数据来源是Mapper任务的输出,那么是否可以在Mapper端对数据进行归约处理,业务逻辑与Reducer端做的完全相同。处理后的数据再传送到Reducer端,再做一次归约。这样的好处是减少了网络传输的数量。

可能有人疑惑几个问题:

为什么需要在Mapper端进行归约处理?

为什么可以在Mapper端进行归约处理?

既然在Mapper端可以进行归约处理,为什么在Reducer端还要处理?

回答第一个问题:因为在Mapper进行归约后,数据量变小了,这样再通过网络传输时,传输时间就变短了,减少了整个作业的运行时间。

回答第二个问题:因为Reducer端接收的数据就是来自于Mapper端。我们在Mapper进行归约处理,无非就是把归约操作提前到Mapper端做而已。

回答第三个问题:因为Mapper端的数据仅仅是本节点处理的数据,而Reducer端处理的数据是来自于多个Mapper任务的输出。因此在Mapper不能归约的数据,在Reducer端有可能归约处理。

在Mapper进行归约的类称为Combiner。那么,怎么写Combiner哪?非常简单,就是我们自定义的Reducer类。那么,怎么用哪?更简单,见如下代码


job.setCombineClass(Mapper.class)

要注意的是,Combiner只在Mapper任务所在的节点运行,不会跨Mapper任务运行。Reduce端接收所有Mapper端的输出来作为输入。虽然两边的归约类是同一个,但是执行的位置完全不一样。

并不是所有的归约工作都可以使用Combiner来做。比如求平均值就不能使用Combiner。因为对于平均数的归约算法不能多次调用。

版权声明:本文为博主原创文章,未经博主允许不得转载。

MapReducer中的多次归约处理

标签:mapreduce   归约处理   hadoop   

原文地址:http://blog.csdn.net/gamer_gyt/article/details/47099979

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!