web-dev-qa-db-ja.com

pythonでのHadoopストリーミングジョブ失敗エラー

このガイド から、サンプルの演習を正常に実行できました。しかし、私のmapreduceジョブを実行すると、次のエラーが発生します
ERROR streaming.StreamJob: Job not Successful!
10/12/16 17:13:38 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

ログファイルのエラー

Java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 2
at org.Apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.Java:311)
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:358)
at org.Apache.hadoop.mapred.MapTask.run(MapTask.Java:307)
at org.Apache.hadoop.mapred.Child.main(Child.Java:170)

Mapper.py

import sys

i=0

for line in sys.stdin:
    i+=1
    count={}
    for Word in line.strip().split():
        count[Word]=count.get(Word,0)+1
    for Word,weight in count.items():
        print '%s\t%s:%s' % (Word,str(i),str(weight))

Reducer.py

import sys

keymap={}
o_Tweet="2323"
id_list=[]
for line in sys.stdin:
    Tweet,tw=line.strip().split()
    #print Tweet,o_Tweet,tweet_id,id_list
    Tweet_id,w=tw.split(':')
    w=int(w)
    if Tweet.__eq__(o_Tweet):
        for i,wt in id_list:
            print '%s:%s\t%s' % (Tweet_id,i,str(w+wt))
        id_list.append((Tweet_id,w))
    else:
        id_list=[(Tweet_id,w)]
        o_Tweet=tweet

[編集]ジョブを実行するコマンド:

hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper /home/hadoop/mapper.py -file /home/hadoop/reducer.py -reducer /home/hadoop/reducer.py -input my-input/* -output my-output

入力は、ランダムな一連の文です。

おかげで、

21
db42

-mapperと-reducerはスクリプト名だけにする必要があります。

hadoop@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-0.20.0-streaming.jar -file /home/hadoop/mapper.py -mapper mapper.py -file /home/hadoop/reducer.py -reducer reducer.py -input my-input/* -output my-output

スクリプトがhdfs内の別のフォルダーにあるジョブにある場合、「。」として実行されている試行タスクに関連しています。 (参考までに、ルックアップテーブルなどの別のファイルを広告する場合は、Pythonで開くことができます。スクリプトがM/Rジョブ)

また、chmod a + x mapper.pyとchmod a + x reducer.pyがあることを確認してください

21
Joe Stein

追加してみてください

 #!/usr/bin/env python

あなたのスクリプトのトップ。

または、

-mapper 'python m.py' -reducer 'r.py'
15
Marvin W

私は最近このエラーに遭遇しましたが、私の問題はこれらの他の解決策と同じように(後から見て)明白なものであることが判明しました:

Pythonコードにバグがありました。(私の場合、Python v2.7文字列フォーマットを使用していたのに対し、AWS EMRクラスターはPython v2.6)を使用します。

実際のPythonエラーを見つけるには、Job TrackerウェブUIに移動します(AWS EMRの場合、AMI 2.xの場合はポート9100、AMI 3.xの場合はポート9026)。失敗したものを見つけます。マッパー、そのログを開き、stderr出力を読み取ります。

2
Dolan Antenucci

ストリーミングにはいくつかのオプションがあるため、マッパーとリデューサーをpythonスクリプトとして使用することを明示的に指示する必要があります。一重引用符または二重引用符を使用できます。

-mapper "python mapper.py" -reducer "python reducer.py" 

または

-mapper 'python mapper.py' -reducer 'python reducer.py'

完全なコマンドは次のようになります。

hadoop jar /path/to/hadoop-mapreduce/hadoop-streaming.jar \
-input /path/to/input \
-output /path/to/output \
-mapper 'python mapper.py' \
-reducer 'python reducer.py' \
-file /path/to/mapper-script/mapper.py \
-file /path/to/reducer-script/reducer.py
1
Gopal Kumar

私もmarvin Wの解決策を試して同じ問題がありましたspark、uがpyspark(dependency)だけでなく、sparkもインストールされていることを確認してください。フレームワークもインストール installtion tutorial

そのチュートリアルに従ってください

0
yunus

入力ディレクトリに正しいファイルのみが含まれていることを確認してください

0
user6454733