技术库 > 网站架构

Hadoop MapReduce编程模型中的Combiner组件

技术库:tec.5lulu.com

每一个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的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。 

Hadoop MapReduce编程模型中的Combiner组件


标签: mapreduce map本文链接 http://tec.5lulu.com/detail/105dwn2i5p6w68sd1.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com