由于来自inputStream的过早EOF,Hadoop MapReduce作业I / O异常

时间:2015-08-17 21:31:35

标签: hadoop mapreduce runtime-error eof ioexception

我使用命令hadoop jar <jar> [mainClass] path/to/input path/to/output运行了MapReduce程序。但是,我的工作挂在:INFO mapreduce.Job: map 100% reduce 29%

很久以后,我终止并检查了datanode日志(我在伪分布式模式下运行)。它包含以下例外:

java.io.IOException: Premature EOF from inputStream
at org.apache.hadoop.io.IOUtils.readFully(IOUtils.java:201)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doReadFully(PacketReceiver.java:213)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.doRead(PacketReceiver.java:134)
at org.apache.hadoop.hdfs.protocol.datatransfer.PacketReceiver.receiveNextPacket(PacketReceiver.java:109)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receivePacket(BlockReceiver.java:472)
at org.apache.hadoop.hdfs.server.datanode.BlockReceiver.receiveBlock(BlockReceiver.java:849)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.writeBlock(DataXceiver.java:804)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.opWriteBlock(Receiver.java:137)
at org.apache.hadoop.hdfs.protocol.datatransfer.Receiver.processOp(Receiver.java:74)
at org.apache.hadoop.hdfs.server.datanode.DataXceiver.run(DataXceiver.java:251)
at java.lang.Thread.run(Thread.java:745)

5秒后,日志中的ERROR DataXceiver error processing WRITE_BLOCK operation

可能导致此异常和错误的问题是什么?

我的NodeHealthReport说:

1/1 local-dirs are bad: /home/$USER/hadoop/nm-local-dir; 
1/1 log-dirs are bad: /home/$USER/hadoop-2.7.1/logs/userlogs

我发现this表示可能需要增加dfs.datanode.max.xcievers。但是,它已被弃用,新属性名为dfs.datanode.max.transfer.threads,默认值为4096.如果更改此项将解决我的问题,我应该将其设置为什么新值?

This表示可能需要增加datanode的ulimit。我的ulimit -n(打开文件)是1024.如果增加这个可以解决我的问题,我应该将它设置为什么?

1 个答案:

答案 0 :(得分:5)

由于多种原因可能会发生过早的EOF,其中一个原因是使用FileOutputCommitter生成大量线程以写入一个reducer节点上的磁盘。 MultipleOutputs类允许您使用自定义名称写入文件,为此,它会为每个文件生成一个线程并将端口绑定到该文件以写入磁盘。现在,这限制了可以写入一个reducer节点的文件数量。当文件数量在一个reducer节点上大致超过12000时遇到此错误,因为线程被杀死并且_temporary文件夹被删除导致过多的这些异常消息。我的猜测是 - 这不是内存超调问题,也不能通过允许hadoop引擎产生更多线程来解决。减少一个节点一次写入的文件数量解决了我的问题 - 通过减少实际写入的文件数量,或通过增加reducer节点。