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

2024-01-13

我使用以下命令运行 MapReduce 程序hadoop jar <jar> [mainClass] path/to/input path/to/output。然而,我的工作却悬在: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

I found this http://mail-archives.apache.org/mod_mbox/hadoop-user/201312.mbox/%3CCAF4PTbxFR5AaGJcHBREUSZNgs-qLo2_kyjcYHTMC6FiABGf+fg@mail.gmail.com%3E这表明dfs.datanode.max.xcievers可能需要增加。但是,它已被弃用,新属性称为dfs.datanode.max.transfer.threads默认值 4096。如果更改此值可以解决我的问题,我应该将其设置为什么新值?

This http://mail-archives.apache.org/mod_mbox/hadoop-user/201303.mbox/%3CCADE3u=buJ6V0CAHxBfxkV_EW-rTSU3gUphvsZA6_awcJBYH8fw@mail.gmail.com%3E表明ulimit对于datanode可能需要增加。我的ulimit -n(打开文件)是 1024。如果增加这个值可以解决我的问题,我应该将其设置为什么?


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于 inputStream 过早 EOF,Hadoop MapReduce 作业 I/O 异常 的相关文章

随机推荐