专栏名称: 刘超的通俗云计算
刘超,网易云解决方案首席架构师,代码级略懂OpenStack、Hadoop、Docker、Lucene、Mesos等开源软件,曾出版《Lucene应用开发揭秘》,个人博客可搜索popsuper1982。
目录
相关文章推荐
奇舞精选  ·  vercel是如何做微前端迁移的 ·  昨天  
奇舞精选  ·  vercel是如何做微前端迁移的 ·  昨天  
架构师之路  ·  MySQL必知必会(再版上架,送10本) ·  4 天前  
架构师之路  ·  漏洞!近千块的技术大会,1折蹭? ·  5 天前  
51好读  ›  专栏  ›  刘超的通俗云计算

大数据方法论之优化Map-Reduce过程

刘超的通俗云计算  · 公众号  · 架构  · 2017-08-21 23:56

正文

大家在写Map-Reduce程序的时候,有时候会发现任务执行时间太长了,可通过下面的方法进行优化。


在Map-Reduce过程中有Counter



首先可以优化Map任务的个数:


Map任务的个数是由Input Splits的个数确定的,每个Input Split对应于一个HDFS文件块。


可通过mapred.min.split.size修改map的个数。


如果一个HDFS文件块里面包含的任务数目太多,例如每一个url是一个视频的链接,但是url占不了几个字符,所以很可能一个HDFS块里面包含了所有的视频的url,则一个map任务处理所有的视频,显然并行不起来。这可以使用NLineInputFormat,几行形成一个map任务,而非整个HDFS文件块作为一个map任务。


如果每个源文件太小,例如每个文件1k,则每个文件一个map任务,这样并行的任务太多了,因而可以使用CombineFileInputFormat,减少并行的数目。


更多的map任务代表着更好的并行度,会使得任务执行速度加快。而且如果任务失败的时候,可以重新执行,代价也比较小。


然而更多的map任务,则map的结果汇集到reduce的时候,则需要更多的网络流量。


当然更多的任务也意味着更多的调度。


其次可以优化reduce任务的个数。


可以通过指定mapred.reduce.tasks指定reduce的个数。


数据传输的个数为Map的个数乘以Reduce的个数。



最好能够减少中间数据,可以通过combiner在map阶段减少输出。



而且在map阶段,尽量增加缓存的大小,从而不会让map的结果写到硬盘上。


而且在map阶段,最好通过压缩,从而减少网络传输的大小,但是会增加压缩和解压缩的过程。


在Reduce阶段,尽量增加缓存的大小,从而尽量减少merge的过程写到磁盘上。



可通过不断的调整这些参数,每次调整一个参数,然后通过Counter看运行的时间变长还是变短,从而不断的优化。