2012-01-12 9 views
2

私は、Pigジョブの出力で作業できるPythonコードを書くための「正しい」方法を探しています。PigへのバインドSTOREまたはDUMPの出力を

ここは私の状況です。私は大量のデータをクランクして少数の関係を出力するために豚スクリプトを書いた。出力データの量は、コンソールに直接ダンプするのに十分です。例えば:次のステップとして

grunt> DUMP results 
(Control, column1, column2, column3, column4, column5, column6) 
(Treatment1, column1, column2, column3, column4, column5, column6) 
(Treatment2, column1, column2, column3, column4, column5, column6) 
(Treatment3, column1, column2, column3, column4, column5, column6) 
grunt> 

、私は例えば、関係全体の数字で計算処理いくつかの番号をしたいです観察された治療結果の重要性についてp値を計算する。私は本当にこれのためにPythonを使いたいと思う:豚自体は明​​らかにそのようなタスクのために意図されていない、と私はJavaで既存のコードを書き直すことを好むだろう。ですから、私がしたいのは、何とかしてSTOREやDUMPコマンドの出力にバインドして、それを前進させることです。私の問題は、最善の方法を考え出すことです。ここに私が見る方法があります:

  1. 計算を実行するUDFを書くためにPythonを使用してください。私がすることができます;実際に私のPigスクリプトはすでにいくつかのPython UDFを呼び出しています。しかし、私の印象は、UDFは一度に1つの関係/入力行で作業することを意図しており、私は目標を達成するために複数の関係からデータを取得する必要があるということです。私はUDF内で何らかの種類の状態ストレージを一緒にハックすることができますが、正しい解決策のようには見えません。
  2. Pig 0.9.1でJythonを使用して埋め込まれたPythonを使用します。私はこのアプローチに大きな期待を持っていましたが、この機能で見つかった限られたドキュメントから、ジョブフローを制御することを主目的としていました(標準的な例は、インターナルアルゴリズムのコンバージェンスを検出しています)。具体的には、成功したか失敗したかなどのジョブメタデータにバインドする方法についてのドキュメントがありますが、出力にバインドする方法はわかりません。これで間違っていることが証明されるのが大好きです。
  3. PythonスクリプトがPigを呼び出して、目的の出力場所のローカルまたはHDFSパスを渡して、ジョブが終了するのを待ってから、Pythonを使用してパスから読み込み/解析の関係を読み込みます。本当にハッキリと思える。

明白なオプションがありますか、上記のオプションの理解に大きな違いがありますか?あなたのご意見は大歓迎です!

+0

私は豚でこれを行う方法がわかりませんが、yelpのmrjobは、ハープストリームで#3で求めているものです。おそらく何とかブタを使うことも可能でしょう。 Googleはちょうどこれを求める人々のいくつかの結果を示しています。ドナルド鉱夫の例は私にとってはかなり単純だと思われます。 – BenH

答えて

3

私はあなたの個人的な経験からの不満を理解しています。 #3は実際には非常に合理的なアプローチですが、私は若干異なるものを提案します。代わりに、両方を実行するためにbashスクリプトラッパーを使用してください。これは素晴らしい機能を持っています。あなたはPythonを介してすべての厄介なシェル呼び出しを行う必要はありません。

のような何か:

pig mypigscript.pig ... 
mkdir /tmp/pigout/ 
hadoop fs -get output/part* /tmp/pigout/ 
cat /tmp/pigout/* | python mypostprocessing.py 

このアプローチについての素晴らしい事は、本番ではパラメータ等、ロギング、と本当に空想取得することができ、私は通常のチェック、すべての異なる相がログファイルに書き込む必要がありさフェーズエラーなどが発生する可能性があります。

これは適切なアプローチであることを納得させるには、レデューサー内の複数のレコードにわたって処理することは望ましくありません。並列化を使用していないため、複数のレデューサーがあり、実際に何も提供していない場合、これは機能しません。私は人々がHadoopにあまりにも多くの計算量を集中させようとする傾向があり、簡単に分かりやすいものを外に出さないと思います。

+0

丁寧な答えをありがとう。私は、より一般的な計算環境に結果を引き出すのではなく、Hadoop減速機で小さな魚の処理を行うことの愚かさを十分に認識しています。私は2つをインターフェースするより合理的な方法を見つけることを望んでいた。あなたが指摘しているように#3はおそらく最高ですが、理想からは遠いです。 2つのシェルスクリプトをラップすることを提案してくれてありがとう - これは良いアイデアであり、物事をより簡単で分かりやすくします。 – Inverseofverse

関連する問題