zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    面向对象第三次总结性博客
    面向对象程序设计lesson2心得体会
    面向对象程序设计先导课程心得体会
    面向对象程序设计先导lesson1心得体会
    Git 学习笔记
    asp.net 的Eval日期時間怎麼格式化
    正則表達式(轉)
    要等彈出窗口顯示信息後,点击确定再跳轉到其他頁面
    彈出窗口,確定再刪除數據
    SQL SERVER 2008中的兩種潛換字符方法
  • 原文地址:https://www.cnblogs.com/myyan/p/4838113.html
Copyright © 2011-2022 走看看