1

単一ノードでhadoop1.0.1を使用しており、Python2.7を使用してタブ区切りファイルをストリーミングしようとしています。MichaelNollの単語数スクリプトをhadoop/pythonを使用して実行することはできますが、ファイルを複製するだけのこの非常に単純なマッパーとレデューサーを機能させることはできません。マッパーは次のとおりです。

import sys

for line in sys.stdin:
    line = line.strip()
    print '%s' % line

レデューサーは次のとおりです。

import sys

for line in sys.stdin:
    line = line.strip()
    print line

入力ファイルの一部は次のとおりです。

1   857774.000000
2   859164.000000
3   859350.000000
...

マッパーとレデューサーはLinux内で正常に動作します。

cat input.txt | python mapper.py | sort | python reducer.py > a.out

しかし、マッパーとレデューサーをchmodした後、入力ファイルをhdfsに移動し、そこにあることを確認して実行します。

bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file mapperSimple.py -mapper mapperSimple.py -file reducerSimple.py -reducer reducerSimple.py -input inputDir/* -output outputDir

次のエラーが発生します。

12/06/03 10:19:11 INFO streaming.StreamJob:  map 0%  reduce 0%
12/06/03 10:20:15 ERROR streaming.StreamJob: Job not successful. Error: # of failed Map Tasks exceeded allowed limit. FailedCount: 1. LastFailedTask: task_201206030550_0003_m_000001
12/06/03 10:20:15 INFO streaming.StreamJob: killJob...
Streaming Job Failed!

何か案は?ありがとう。

4

2 に答える 2

3

Pythonファイルにshebang/hashbangヘッダーがありますか?あなたの問題は、JavaがマッパーPythonファイルを実行するようになると、OSにファイルの実行を要求し、shebang / hashbang表記がないと、ファイルの実行方法がわからないことだと思います。chmod a+x mapperSimple.pyまた、ファイルが実行可能アクセス許可( )でマークされていることを確認します。

#!/usr/bin/python
import sys

for line in sys.stdin:
    line = line.strip()
    print '%s' % line

コマンドラインからこれを試して、シェルがPythonインタープリターでファイルを実行することを認識していることを確認します。

cat input.txt | ./mapper.py | sort | ./reducer.py > a.out
于 2012-06-03T14:50:17.517 に答える
0

Chris White Answerに加えて、shebangヘッダーは次のようになります。

#!/usr/bin/env python

デフォルトでpython2.7を使用します。python3を使用する場合は、次を使用できます。

#!/usr/bin/env python3

そして使用しないでください:

#!/usr/bin/python

それはほとんどのコンピュータで失敗するので..私のものを含む****ため息****

詳細については、この回答を確認してください

于 2017-04-30T03:29:30.640 に答える