当我运行hadoop作业时,我收到以下错误:
用户杀死任务'attempt_201202230353_23186_r_000004_0'的请求 用户已将任务KILLED_UNCLEAN
日志看起来很干净。我运行了28个减速器,这并不适用于所有减速器。它适用于选定的几个,并且减速器再次启动。我不明白这一点。我注意到的另一件事是,对于一个小数据集,我很少看到这个错误!
答案 0 :(得分:4)
有三件事要尝试:
设置一个计数器
如果Hadoop看到一个工作进度的计数器,那么它就不会杀死它(参见Arockiaraj Durairaj的答案。)这似乎是最优雅的,因为它可以让您更深入地了解长时间运行的工作,并且可能是挂断。
更长的任务超时
默认情况下,Hadoop作业在10分钟后超时。更改超时有点蛮力,但可以工作。想象一下,分析一般为5MB文件(歌曲)的音频文件,但你有几个50MB的文件(整张专辑)。 Hadoop每个块存储一个单独的文件。因此,如果您的HDFS块大小为64MB,则5MB文件和50 MB文件都需要1个块(64MB)(请参阅此处http://blog.cloudera.com/blog/2009/02/the-small-files-problem/,此处Small files and HDFS blocks。)但是,5MB作业将运行比50MB的工作要快。根据这个类似问题的答案,可以在代码(mapred.task.timeout)中增加任务超时:How to fix "Task attempt_201104251139_0295_r_000006_0 failed to report status for 600 seconds."
增加任务尝试次数
配置Hadoop以进行超过4次默认尝试(请参阅Pradeep Gollakota的回答)。这是三者中最蛮力的方法。 Hadoop会尝试更多次,但你可能会掩盖一个潜在的问题(小型服务器,大型数据块等)。
答案 1 :(得分:1)
你可以尝试在减少逻辑中使用计数器(hadoop计数器)吗?看起来hadoop无法确定您的reduce程序是在运行还是挂起。即使您的逻辑仍在执行,它等待几分钟并杀死它。