Hadoop深入学习:Combiner
在本节中,我们着重学习MapReduce编程模型中的Combiner组件。
每一个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的时候,减少写入本地磁盘的数据量,同样也减少了对磁盘的读写频率,可以起到优化作业的目的。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
开源大数据利器汇总
类别 名称 官网 备注 查询引擎 Phoenix http://phoenix.incubator.apache.org/ Salesforce公司出品,ApacheHBase之上的一个SQL中间层,完全使用Java编写 Stinger http://hortonworks.com/labs/stinger/ http://tez.incubator.apache.org/ 原叫Tez,下一代Hive,Hortonworks主导开发,运行在YARN上的DAG计算框架 Presto http://prestodb.io/ Facebook开源 Shark http://shark.cs.berkeley.edu/ Spark上的SQL执行引擎 Pig http://pig.apache.org/ 基于HadoopMapReduce的脚本语言 ClouderaImpala http://www.cloudera.com/content/cloudera/en/products-and-services/cdh/impala.html 参照GoogleDremel实现,能运行在HDFS或HB...
- 下一篇
SuSE Linux上修改主机名
1)临时修改主机名 临时修改使用hostname即可,格式为:hostname新主机名。Hostname命令除可以临时修改主机名外,还可以用它来查看主机名,不带参数执行它,即为查看主机名。 2)永久修改主机名 修改文件/etc/HOSTNAME即可: cat/etc/HOSTNAME VM-40-171-sles10-64 但修改后,如果不重启系统,则不会立即生效。如果希望立即生效,但不愿意重启,则可以通过执行命令“/etc/rc.d/boot.localnetstart”来实现。 注意Hadoop要求主机名中不能包含下划线。
相关文章
文章评论
共有0条评论来说两句吧...