hadoop-streaming:reducer处于待定状态,不启动?

0 投票
2 回答
1613 浏览
提问于 2025-04-17 05:21

我有一个MapReduce任务,之前运行得很好,但最近开始出现一些失败的映射任务,像这样:

attempt_201110302152_0003_m_000010_0    task_201110302152_0003_m_000010 worker1 FAILED  
Task attempt_201110302152_0003_m_000010_0 failed to report status for 602 seconds. Killing!
-------
Task attempt_201110302152_0003_m_000010_0 failed to report status for 607 seconds. Killing!
Last 4KB
Last 8KB
All
attempt_201110302152_0003_m_000010_1    task_201110302152_0003_m_000010 master  FAILED  
java.lang.RuntimeException: java.io.IOException: Spill failed
    at org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:325)
    at org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545)
    at org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:132)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:57)
    at org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:36)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:436)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:261)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:396)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059)
    at org.apache.hadoop.mapred.Child.main(Child.java:255)
Caused by: java.io.IOException: Spill failed
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.collect(MapTask.java:1029)
    at org.apache.hadoop.mapred.MapTask$OldOutputCollector.collect(MapTask.java:592)
    at org.apache.hadoop.streaming.PipeMapRed$MROutputThread.run(PipeMapRed.java:381)
Caused by: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find any valid local directory for output/spill11.out
    at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:381)
    at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:146)
    at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:127)
    at org.apache.hadoop.mapred.MapOutputFile.getSpillFileForWrite(MapOutputFile.java:121)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1392)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.access$1800(MapTask.java:853)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer$SpillThread.run(MapTask.java:1344)
Last 4KB
Last 8KB
All

现在归约器(reducer)没有开始执行,而之前归约器在映射任务运行时就会开始复制数据,现在我看到的只有这个:

11/10/31 03:35:12 INFO streaming.StreamJob:  map 95%  reduce 0%
11/10/31 03:44:01 INFO streaming.StreamJob:  map 96%  reduce 0%
11/10/31 03:51:56 INFO streaming.StreamJob:  map 97%  reduce 0%
11/10/31 03:55:41 INFO streaming.StreamJob:  map 98%  reduce 0%
11/10/31 04:04:18 INFO streaming.StreamJob:  map 99%  reduce 0%
11/10/31 04:20:32 INFO streaming.StreamJob:  map 100%  reduce 0%

我对HadoopMapReduce还是个新手,不太清楚为什么之前运行得好的代码现在会失败。

请帮帮我。

谢谢!

2 个回答

0

我之前也遇到过这个问题,解决它我做了两件事:

第一件事是压缩你的映射器输出,使用 mapred.output.compress=true。当你的映射器运行时,输出会被写入到磁盘,有时候这些输出需要发送到另一台机器上的归约器。压缩输出可以减少网络流量,同时也能减少运行映射器的机器上所需的磁盘空间。

第二件事是增加hdfs和mapred用户的限制。我在 /etc/security/limits.conf 文件中添加了这些行:

mapred      soft    nproc       16384
mapred      soft    nofile      16384
hdfs        soft    nproc       16384
hdfs        soft    nofile      16384
hbase       soft    nproc       16384
hbase       soft    nofile      16384

这篇文章有更详细的解释:http://www.cloudera.com/blog/2009/03/configuration-parameters-what-can-you-just-ignore/

1

你可以看看 mapred.task.timeout 这个设置。如果你要处理的数据量非常大,而可用的机器又很少,那么你的任务可能会超时。你可以把这个值设置为 0,这样就可以关闭超时限制。

另外,如果你能调用 context.progress 或者类似的功能,告诉系统有事情在进行中,这样任务就不会超时了。

撰写回答