码迷,mamicode.com
首页 > 其他好文 > 详细

错误的配置使reduce tasks一直处于Pending状态

时间:2015-03-06 00:55:29      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

正确设置Hadoop程序运行时的参数可以提高程序的运行效率,但是错误的设置也会带来效率的降低,甚至程序的失败。我今天就遇到了这种情况,事情是这样的:

在Hadoop的配置中有这样一个参数:

mapred.reduce.slowstart.completed.maps: 这个参数控制reducer何时开始运行,也就是何时开始将mapper的输出拷贝到reducer本地。通常情况下,reducer不必等待所有mapper都运行结束后才开始拷贝,合理设置这个属性可以减少整个job的运行时间。比如,如果将这个属性设置为0.50,那么当超过50%的mapper完成时,reducer开始进行copy过程,将已完成的mapper的输出拷贝到本地,准备sort。

但是我司的集群规模有限,分配给reducer的task slot比较少。如果reducer启动过早,并且mapper运行较慢,那么reducer将长时间占有reduce task slot。当reduce slot不足时,别人提交的job将不得不进行等待。本着“人人爱我我爱人人”的原则,同时也是因为我这个job的mapper较多,需要运行很长一段时间,我将这个属性设置为0.95,即95%的mapper完成了,才启动reducer。

在Hadoop的配置中还有另外一个参数:

mapred.max.map.failures.percent:这个参数控制一个job可以容忍多少个mapper失败而不将这个job标记为失败。我的程序的输入来自于一个外部数据流,这个数据流很不稳定,并且丢失一部分数据对程序的运行结果影响不大。因此我将这个参数设置为25, 即少于25%的mapper失败时,仍然继续运行程序,只处理成功的mapper输出的结果。

我想说到这里大家应该已经明白问题在哪了,今天这个程序有15%的mapper失败了,没有超过mapred.max.map.failures.percent的限制,但是只有85%的job完成了,没有达到mapred.reduce.slowstart.completed.maps的启动条件,因此reducer一直不启动,始终处于pending状态。直到负责持续集成的Jenkins发现这个job超时了,将这个job杀死,并给我发了警告。

我不确定所有的hadoop版本都有这个问题,最近事情较多,有时间再来仔细研究这个问题。

错误的配置使reduce tasks一直处于Pending状态

标签:

原文地址:http://www.cnblogs.com/davidhaslanda/p/4317037.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!