我写了一个mapreduce作业来从数据集中提取一些信息.数据集是用户对电影的评分.用户数约为250K,电影数约为300k.地图的输出是
.在reducer中,我将处理这些对.
但是当我运行这个工作时,映射器按预期完成,但是reducer总是抱怨
Task attempt_* failed to report status for 600 seconds.
我知道这是由于无法更新状态,所以我context.progress()
在我的代码中添加了一个调用,如下所示:
int count = 0; while (values.hasNext()) { if (count++ % 100 == 0) { context.progress(); } /*other code here*/ }
不幸的是,这没有帮助.仍有许多减少任务失败.
这是日志:
Task attempt_201104251139_0295_r_000014_1 failed to report status for 600 seconds. Killing! 11/05/03 10:09:09 INFO mapred.JobClient: Task Id : attempt_201104251139_0295_r_000012_1, Status : FAILED Task attempt_201104251139_0295_r_000012_1 failed to report status for 600 seconds. Killing! 11/05/03 10:09:09 INFO mapred.JobClient: Task Id : attempt_201104251139_0295_r_000006_1, Status : FAILED Task attempt_201104251139_0295_r_000006_1 failed to report status for 600 seconds. Killing!
BTW,错误发生在reduce to copy阶段,日志说:
reduce > copy (28 of 31 at 26.69 MB/s) > :Lost task tracker: tracker_hadoop-56:localhost/127.0.0.1:34385
谢谢您的帮助.
最简单的方法是设置此配置参数:
mapred.task.timeout 1800000
在 mapred-site.xml
最简单的另一种方法是在程序内部设置作业配置
Configuration conf=new Configuration(); long milliSeconds = 1000*60*60;**在设置之前,请检查jobtracker GUI中的Job文件(job.xml)文件,了解正确的属性名称,无论是mapred.task.timeout还是mapreduce.task.timeout...在运行作业时,再次检查作业文件中是否根据设置的值更改了该属性.
3> keelar..:在较新的版本中,参数的名称已更改
mapreduce.task.timeout
为此链接(搜索task.timeout
)中所述.此外,您还可以按照上面的链接中所述禁用此超时:如果任务既不读取输入,也不写入输出,也不更新其状态字符串,则终止任务前的毫秒数.值为0将禁用超时.
以下是以下示例设置
mapred-site.xml
:mapreduce.task.timeout 0