hadoop——Map/Reduce中combiner的使用

一、作用

1、combiner最基本是实现本地key的聚合,对map输出的key排序,value进行迭代。如下所示:

map: (K1, V1) → list(K2, V2) 
combine: (K2, list(V2)) → list(K2, V2) 
reduce: (K2, list(V2)) → list(K3, V3)

2、combiner还具有类似本地的reduce功能.

例如hadoop自带的wordcount的例子和找出value的最大值的程序,combiner和reduce完全一致。如下所示:
map: (K1, V1) → list(K2, V2) 
combine: (K2, list(V2)) → list(K3, V3) 
reduce: (K3, list(V3)) → list(K4, V4)

3、如果不用combiner,那么,所有的结果都是reduce完成,效率会相对低下。使用combiner,先完成的map会在本地聚合,提升速度。

4、对于hadoop自带的wordcount的例子,value就是一个叠加的数字,所以map一结束就可以进行reduce的value叠加,而不必要等到所有的map结束再去进行reduce的value叠加。

二、总结

1、combiner使用的合适,可以在满足业务的情况下提升job的速度,如果不合适,则将导致输出的结果不正确。

 

 每一个map都可能会产生大量的本地输出,Combiner的作用就是对map端的输出先做一次合并,以减少在map和reduce节点之间的数据传输量,以提高网络IO性能,是MapReduce的一种优化手段之一

        1)、Combiner最基本是实现本地key的聚合,对map输出的key排序、value进行迭代。如下所示:

引用

        map:(key1,value1) ——> list(key2,value2)
        conbine:(key2,list(value2)) ——> list(key2,value2)
        reduce:(key2,list(value2)) ——> list(key3,value3)
       


        2)、Combiner还有本地reduce功能(其本质上就是一个reduce):

引用

        map:(key1,value1) ——> list(key2,value2)
        conbine:(key2,list(value2)) ——> list(key3,value3)
        reduce:(key3,list(value3)) ——> list(key4,value4)
       


        3)、如果不用Combiner,南无说有的结果都会在reduce端完成,效率比较低小,并且会占用很多的网络IO;使用Combiner先完成在map端的本地聚合,可以减少网络传输数据量,提高性能。

        但是,不要以为在写MapReduce程序时设置了Combiner就认为Combiner一定会起作用,实际情况是这样的吗?答案是否定的。hadoop文档中也有说明Combiner可能被执行也可能不被执行。那么在什么情况下不执行呢?如果当前集群在很繁忙的情况下job就是设置了也不会执行Combiner。

        另外还要注意,Combiner使用的合适的话会提高Job作业的执行数度,但是使用不合适的话,会导致输出的结果不正确。Combiner的输出是Reduce的输入,它绝不会改变最终的计算结果。
        Conbiner的适用场景比如说在汇总统计时,就可以使用Conbiner,但是在求平均数的时候就是适合适用了。

        最后,我们再来看一下Combiner的执行时机。我们之前已对map端的shuffle做过比较升入的了解,详情请看MapTask详解。那么,Combiner会在map端的那个时期执行呢?实际上,Conbiner函数的执行时机可能会在map的merge操作完成之前,也可能在merge之后执行,这个时机由配置参数min.num.spill.for.combine(该值默认为3),也就是说在map端产生的spill文件最少有min.num.spill.for.combine的时候,Conbiner函数会在merge操作合并最终的本机结果文件之前执行,否则在merge之后执行。通过这种方式,就可以在spill文件很多并且需要做conbine的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。

参考:http://blog.csdn.net/ipolaris/article/details/8723782

http://blog.csdn.net/cnbird2008/article/details/23788233

http://hadoop.apache.org/docs/r1.2.1/streaming.html#Hadoop+Streaming

posted on 2015-09-25 14:29  月未央  阅读(3204)  评论(0编辑  收藏  举报

导航