1

首先,我是Hadoop的新手。

我有一个抛出 java.io.EOFException 的小型 Hadoop 管道程序。该程序将一个小文本文件作为输入,并使用 hadoop.pipes.java.recordreader 和 hadoop.pipes.java.recordwriter。输入非常简单,例如:

1 262144 42.8084 15.9157 4.1324 0.06 0.1

但是,Hadoop 会抛出 EOFException,我看不出原因。下面是堆栈跟踪:

10/12/08 23:04:04 INFO mapred.JobClient: Running job: job_201012081252_0016
10/12/08 23:04:05 INFO mapred.JobClient:  map 0% reduce 0%
10/12/08 23:04:16 INFO mapred.JobClient: Task Id : attempt_201012081252_0016_m_000000_0, Status : FAILED 
java.io.IOException: pipe child exception
    at org.apache.hadoop.mapred.pipes.Application.abort(Application.java:151)
    at org.apache.hadoop.mapred.pipes.PipesMapRunner.run(PipesMapRunner.java:101)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
    at org.apache.hadoop.mapred.Child.main(Child.java:170)
Caused by: java.io.EOFException
    at java.io.DataInputStream.readByte(DataInputStream.java:267)
    at org.apache.hadoop.io.WritableUtils.readVLong(WritableUtils.java:298)
    at org.apache.hadoop.io.WritableUtils.readVInt(WritableUtils.java:319)
    at org.apache.hadoop.mapred.pipes.BinaryProtocol$UplinkReaderThread.run(BinaryProtocol.java:114)

顺便说一句,我在完全分布式模式(具有 3 个工作节点的集群)上运行它。

任何帮助表示赞赏!谢谢

4

2 回答 2

1

经验教训:无论如何,尽量确保你自己的程序没有错误。

于 2010-12-09T21:03:00.917 回答
0

此堆栈跟踪通常表示您的工作机器中的可用文件描述符已用完。这是非常常见的,记录很少,这正是我对这个主题有两个相关 问题的原因。

如果您在所有机器上都具有 root 访问权限,则应考虑通过编辑提高 Hadoop 用户的文件描述符限制/etc/sysctl.conf

(Add) fs.file-max = 4096

或发出:

ulimit -Sn 4096
ulimit -Hn 4096

无穷无尽。此处提供了有关提高此限制的一般信息

但是,从长远规划的角度来看,这种策略有些虚假。如果您碰巧发现有关该问题的更多信息,也许您可​​以帮助我帮助您帮助我们所有人?[谢谢你,GLaDOS。-埃德]

(编辑:见下面的评论。)

于 2010-12-09T06:15:19.253 回答