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

このスタックトレースは通常、ワーカーマシン内で使用可能なファイル記述子が不足していることを示しています。これは非常に一般的で、まばらに文書化されており、まさにこの主題に関して2つの関連する 質問がある理由です。

すべてのマシンでrootアクセス権がある場合は、以下を編集して、Hadoopユーザーのファイル記述子の制限を引き上げることを検討する必要があります/etc/sysctl.conf

(Add) fs.file-max = 4096

または発行:

ulimit -Sn 4096
ulimit -Hn 4096

広告は無限大。この制限を引き上げるための一般的な情報は、こちらから入手できます。

ただし、長期計画の観点からは、この戦略はやや偽りです。問題に関する詳細情報を見つけた場合は、私が私たち全員を助けるのを手伝ってくれるかもしれません。[ありがとう、GLaDOS。-エド]

(編集:次の解説を参照してください。)

于 2010-12-09T06:15:19.253 に答える