1

ログファイルを分析し、サマリー出力をS3に書き込むPigジョブがあります。出力をS3に書き込む代わりに、JSONペイロードに変換してURLにPOSTしたいと思います。

いくつかのメモ:

  • このジョブはAmazonElasticMapReduceで実行されています。
  • STREAMを使用して、外部コマンドを介してデータをパイプし、そこからロードすることができます。ただし、Pigが外部コマンドにEOFを送信することはないため、これは、各行が到着したときにPOSTする必要があり、それらをバッチ処理できないことを意味します。明らかに、これはパフォーマンスを低下させます。

この問題に対処するための最良の方法は何ですか?PiggyBankまたは他のライブラリに使用できるものはありますか?または、新しいストレージアダプタを作成する必要がありますか?アドバイスありがとうございます!

4

3 に答える 3

4

ストリーミングではなく、UDFを作成できます(UDFfinish()コールバックを提供するため)[1]

別のアプローチは、データの2番目のパスとしてPOSTを実行することです。

  1. json文字列として単一のリレーションに書き出すだけの既存の豚のステップ
  2. NLineInputFormatを使用してPOSTをバッチで実行する単純なストリーミングジョブ

私は常にこのスタイルのアプローチを好みます。なぜなら、それは懸念を分離し、豚のコードをきれいにするからです。

また、(私の考えでは)ジョブのPOST部分でより簡単なチューニングオプションを使用できます。この場合、受信するWebサービスのべき等性に応じて、投機的実行をオフにすることが(おそらく)重要です。多数の同時ジョブを実行しているクラスターがサーバーを完全に強制終了する可能性があることに注意してください:D

たとえば、20のバッチで投稿する場合...

$ hadoop jar〜/ contrib / streaming / hadoop-streaming.jar \
  -D mapred.line.input.format.linespermap = 20 \
  -D mapred.reduce.tasks.speculative.execution = false \
  -input json_data_to_be_posted -output output \
  -マッパーyour_posting_script_here.sh\
  -numReduceTasks 0 \
  -inputformat org.apache.hadoop.mapred.lib.NLineInputFormat

[1] http://pig.apache.org/docs/r0.7.0/api/org/apache/pig/EvalFunc.html#finish%28%29

于 2011-07-01T17:05:27.387 に答える
1

おそらく、Pigの外部でデータの投稿を処理する必要があります。豚をbashで包むのは、通常、ポスト(しゃれを意図していない)処理ステップのUDFを実行するよりも簡単であることがわかりました。S3にヒットしたくない場合は、dump代わりにを使用storeして、投稿される標準を処理できます。それ以外の場合は、S3に保存し、で引き出してから、または何かhadoop fs -cat outputpath/part*で送信します。curl

于 2011-07-03T02:13:20.857 に答える
0

結局のところ、PigEOFを外部コマンドに正しく送信するため、外部スクリプトを介してすべてをストリーミングするオプションがあります。それが機能しない場合は、おそらくデバッグが難しい構成の問題があります。

開始方法は次のとおりです。必要なインタプリタとスクリプトを使用して、次のように外部コマンドを定義します。

DEFINE UPLOAD_RESULTS `env GEM_PATH=/usr/lib/ruby/gems/1.9.0 ruby1.9 /home/hadoop/upload_results.rb`;

スクリプトを介して結果をストリーミングします。

/* Write our results to our Ruby script for uploading.  We add
   a trailing bogus DUMP to make sure something actually gets run. */
empty = STREAM results THROUGH UPLOAD_RESULTS;
DUMP empty;

Rubyから、入力レコードを1024のブロックにバッチ処理できます。

STDIN.each_line.each_slice(1024) do |chunk|
  # 'chunk' is an array of 1024 lines, each consisting of tab-separated
  # fields followed by a newline. 
end

これが機能しない場合は、以下を注意深く確認してください。

  1. スクリプトはコマンドラインから機能しますか?
  2. Pigから実行する場合、スクリプトには必要なすべての環境変数が含まれていますか?
  3. EC2ブートストラップアクションは正しく機能していますか?

これらのいくつかは検証が困難ですが、いずれかが失敗した場合、デバッグにかなりの時間を簡単に浪費する可能性があります。

ただし、matkelceyが推奨する代替アプローチを強く検討する必要があることに注意してください。

于 2011-07-21T11:28:45.017 に答える