Map和Reduce任务的优化

编程总是围绕着两个问题:“如何完成这个任务”和“如何能让程序运行得更快”

因此,相对应的MapReduce计算模型的优化也就集中在两个方面:一是计算性能方面的优化;二是I/O操作方面的优化

1、任务调度

两个方面的优化:一是计算方面:Hadoop总会先将任务分配给空闲的机器,使所有的任务能公平地分享系统资源;二是I/O方面:Hadoop会尽量将map任务分配给InputSplit所在的机器,以减少网络I/O的消耗。(分配的就近原则)

2、数据预处理和InputSplit的大小

2.1.原因:MapReduce擅长处理少量的大数据,而在处理大量的小数据时,性能要逊色很多。

2.2.优化措施:在提交MapReduce任务之前可以对数据进行一次预处理,将数据合并以提高执行效率(很有效)。
进一步优化:可以考虑map任务的运行时间,当一个map任务只需要运行几秒钟就可以结束时,就需要考虑是否应该给它分配更多的数据了。(一分钟左右比较合适)——设置方法:可通过设置map的输入数据大小来调节map的运行时间。A、合理地设置block块的大小(在FileInputFormat中,hadoop会在处理每个block后将其作为一个InputSplit);B、合理地设置map任务的数量。

3、map和reduce任务的数量

3.1.定义:map任务槽和reduce任务槽就是这个集群能够同时运行的map/reduce任务的最大数量。(比如在一个具有1200台机器的集群中,设置每台机器最多可以同时运行10个map和5个reduce,那么这个集群的map任务槽就是12000,reduce任务槽是6000。)

3.2.设置reduce数量

(map数量设置主要考虑它的运行时间)

设置reduce的数量时只需要参考任务槽的设置。一般来说reduce任务的数量应该是reduce任务槽的0.95倍或是1.75倍。

0.95倍易于找到空闲机器处理失败的任务。1.75则可以使负载更加均衡(执行速度快的机器可以获得更多的任务),以提高任务的处理速度。

4、combine函数
4.1.作用:用于在本地合并数据。例如,在单词计数中,combine函数先计算出在这个block中某个单词的个数,再传输给reduce。如下图:

没有使用combine函数

使用了combine函数


4.2.使用方法:job.setcombineClass(combine.class);
在WordCount程序中,可以指定reduce函数为combine函数
job.setReduceClass(Reduce.class)

5、压缩
编写MapReduce程序时,可以选择对map的输出和最终的输出结果进行压缩(可自行选择压缩方式)。

#当map的中间输出很大时,对其进行压缩可以有效地减少网络上的数据传输量。

#对最终结果的压缩虽然可以减少数据写入HDFS的时间,但是也会对读取产生一定的影响,因此要根据时间情况来选择。
6、自定义comparator(自定义数据类型以实现更复杂的目的)
比如:k-means算法(基础的聚类算法)。

 

本篇博文内容主要来自《Hadoop实战》一书。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值