MapReduce任务的优化

[b][size=x-large][align=center]MapReduce任务的优化[/align][/size][/b]

MapReduce计算模型的优化涉及了方方面面的内容,但是主要集中在两个方面:一是计算性能方面的优化;二是,I/O操作方面的优化。这其中,又包括六个方面的内容。

[b]1.任务调度[/b]
任务调度是hadoop中非常重要的一个环节,这个优化又涉及了两个方面的内容。计算方面:hadoop总会优先将任务分配给空闲的机器,使所有的任务能公平的分享系统资源。I/O方面:hadoop会尽力将Map任务分配给InputSplit所在的机器,以减少网络I/O的消耗。

[b]2.数据处理与InputSplit的大小[/b]
MapReduce任务擅长处理少量的大数据,而在处理大量的小数据时,MapReduce的性能会逊色很多。因此在提交MapReduce任务前可以先对数据进行一次预处理,将数据合并以提高MapReduce任务的执行效率,这个方法往往很有效。如果这还不行,可以参考MapReduce任务的运行时间。当一个Map任务只需要运行几秒就可以结束时,就需要考虑是否应该给他分配更多的数据。通常而言,一个Map任务的运行时间在一分钟左右会比较合适,可以通过设置Map的输入数据大小来调节Map任务的运行时间。在FileInputFormat中(除了combineFileInputFormat),hadoop会处理每个Block后将其作为一个inputSplit,因此合理的设置block块大小是很重要的调节方式。除此之外,也可以通过合理地设置Map任务的数量来调节Map任务的数据输入。

[b]3.Map和Reduce任务的数量[/b]
合理的设置Map和Reduce任务的数量对提高MapReduce任务的效率是非常重要的。默认的设置往往不能和好的体现出MapReduce任务的需求,不过,设置他们的数量也要有一定的实践经验。
首先要定个两个概念-----Map/Reduce任务槽。Map/Reduce任务槽就是这个集群能够同时运行的Map/Reduce任务的最大数量。比如:在一个具有1200台机器的集群中,设置每台机器最多可以运行10个Map任务,5个Reduce任务。那么这个集群的Map任务槽数量就是12000,Reduce任务槽就是6000。任务槽可以帮助对任务调度进行设置。
设置MapReduce任务的Map数量主要参考的是Map运行的时间,设置Reduce任务的数量就只需要参考任务槽的设置即可。一般来说,Reduce任务的数量应该是Reduce任务槽数量的0.95或者1.75倍,这是基于不同的考虑来决定的。当Reduce任务数是Reduce任务槽数量的0.95倍时,如果一个Reduce失败,hadoop可以很快的找到一台空闲的机器重新执行这个任务。当Reduce任务数是Reduce任务槽的1.75倍时,执行速度快的机器可以可以获得更多的reduce任务,一次可以使负载更加均衡,以提高任务的处理速度。

[b]4.Combine函数[/b]
Combine函数是用于本地合并数据的函数。在有些情况下,Map函数产生中间数据会有很多重复的,比如在一个简单的WordCount程序中,因为词频是接近与一个zipf分布的,每个Map任务可能会产生成千上万个<zhe,1>记录,若将这些记录一一传送给Reduce任务是很耗时的。所以MapReduce框架运行用户写的combine函数用于本地合并,这会大大减少网络I/O操作的消耗此时就可以利用combine函数先计算出在这个block中单词zhe的个数。合理的设计combine函数会有效的减少网络传输的数据量,提高mapreduce的效率。
在MapReduce程序中使用combine函数很简单,只需要在程序中添加如下内容:
job.setCombineClass(combine.classs);

在WordCount程序中,可以指定Reduce类为combine函数,如下:
job.setCombineClass(Reduce.class);


[b]5.压缩[/b]
编写MapReduce程序时,可以选择对Map的数据和最终的输出结果进行压缩(同时可以选择压缩方式)。在一些情况下,Map的中间输出可能会很大,对其进行压缩可以有效的减少网络上传输量。对最终结果进行压缩虽然会减少数据写HDFS的时间,但是也会对读取产生一定的影响,因此要根据实际情况来选择。

[b]6.自定义comparator[/b]
在hadoop中,可以自定义数据类型以实现更复杂的目的,比如:当读者想实现k-means算法(一种聚类的算法)时可以自顶一个K个整数的集合。自定义hadoop数据类型时,推荐自定义comparator来实现数据的二进制比较,这样可以省去数据序列化和反序列化的时间,提高程序的运行效率。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值