4

Hadoop APIを使用してJavaでプログラムを作成しました。したがって、その Java コードの出力は jar です。たとえば、foo.jar とします。

その jar ファイルを Hadoop で実行するには、次のようにします。

hadoop jar foo.jar org.foo.bar.MainClass input output

これにより、長い Hadoop タスク (数分など) が開始されます。

ジョブが実行されている間.. Hadoop は進行状況を教えてくれます..

Map 0%, Reduce 0%
Map 20%, Reduce 0%
....

など..ジョブが終了した後、hadoop は大量の統計情報 (入力サイズ、分割、レコードなど) を吐き出します..これはすべてコマンド ラインから実行されます..

今、私がやろうとしているのは.. Pythonからこのプログラムを呼び出すことです(単純なシステム実行を使用して..)

しかし、私が欲しいのは..このpythonコードを実行すると..これらの統計の一部も表示したい..しかし、すべてではない..

だから、私が探しているのは、そのjar実行によって表示されているこれらの統計をキャプチャし、Python内で処理し、その処理された統計を表示する方法です..

たとえば..デフォルトでは、hadoop が表示します..

Map 0%, Reduce 0%
Map 20%, Reduce 0%

...

等々..

そして多分私が持っているのは...

def progress_function(map,reduce):

      return sum([map,reduce])/2.0

そして、コマンドプロンプトに表示しています..

progress so far:0
progress so far:10

and so on..

簡単に言えば..私はJavaプログラムのjarを持っています..実行するといくつかの統計が吐き出されます..このJava jarをPythonから実行したい..そしてこれらの統計をキャプチャします...そしてPython内でそれらを変更し、これらの python 統計をユーザーに表示します。

4

1 に答える 1

1

さまざまな理由から、この種の問題にはシェル パイプを使用する必要があります。これにより、設計の観点から柔軟性が高まり、Python からプロセスを呼び出すのが面倒になる可能性があります。さらに重要なことに、パイピングにより、プログラミングの実行中に Python スクリプトが出力を簡単に使用できるようになります。

hadoop jar foo.jar org.foo.bar.MainClass input output 2>&1 | python myscript.py

経由myscript.pyで入力を取り込み、 でstdin正常に出力するだけprintです。

2>&1パイプは出力を stderr ではなく stdout から移動するため、シェル コマンドの は stderr を stdout にリダイレクトすることに注意してください。

于 2013-10-23T16:42:06.487 に答える