2011-07-29 15 views
10

私はHadoop(AmazonのEMR)でストリーミングジョブを実行しています。マッパーとレデューサーはPythonで書かれています。私はJavaで同じマッパーとレデューサーを実装する(またはPigを使用する)場合、私が経験する速度の向上について知りたい。Streaming or Custom Jar in Hadoop

特に、ストリーミングからカスタムjarデプロイメントおよび/またはPigに移行する際の人々の経験と、これらのオプションのベンチマーク比較を含むドキュメントを探しています。私はこれを見つけましたquestion、しかし答えは私のために十分ではありません。私はJavaとPythonの比較はしていませんが、HadoopのカスタムjarデプロイメントとPythonベースのストリーミングの比較を探しています。

私の仕事は、GoogleブックスNGgramデータセットからNGramカウントを読み取り、集約メジャーを計算しています。計算ノードのCPU使用率は100%に近いようです。 (私はCPUバインドやIOバインドジョブの違いについてあなたの意見を聞きたいと思います)。

ありがとうございます!

アマノ

答えて

4

なぜカスタムジャーの展開を検討しますか?

  • より強力なカスタム入力フォーマットを使用する能力。ストリーミングジョブの場合、プラグイン可能な入出力を使用しても、hereのように、マッパー/レデューサーのキーと値はテキスト/文字列に限定されます。必要なタイプに変換するには、ある程度のCPUサイクルを費やす必要があります。
  • アイブ氏はまた、

ときに豚を使用する(これを確認することはできません)のHadoopストリーミング時に文句を言わない可能性が複数のジョブ間でのJVMを再利用に関する賢いことができることを聞きましたか?

  • Pig Latinは、Java/pythonまたはperlよりもはるかに高いレベルのデータフロー言語です。あなたの豚のスクリプトは、他の言語で書かれた同等の仕事よりもはるかに小さい傾向にあります

豚を使用しない場合は?豚はどのように多くのマップ/削減自身で考え出すでかなり良いですが

  • とするときマップを起動または低減し、このようなことの無数の、あなたが必要とどのように多くのマップ/削減死ん確信している場合と、マップ/リダクション関数内で行う必要がある非常に特定の計算があり、パフォーマンスについては非常に具体的です。したがって、独自のjarを配置することを検討する必要があります。このlinkは、ブタがネイティブハープM/Rの性能を遅らせることができることを示しています。あなたはIOとCPUバウンドジョブに

    注意をまた、いくつかの計算集約的な機能を分離され、独自の豚UDFsを書いて見てみましょう(そしておそらくさえUDF内のいくつかのネイティブC/C++コードを呼び出すためにJNIを使​​用)

ができ:

  • 技術的に言えば、hadoopとmap reduceの全体的なポイントは、計算集中型関数を並列化することです。マップと削減ジョブは計算集中型です。 HadoopサブシステムがIOを実行中である唯一の時間は、データがネットワークを介して送信されるときのマップとフェーズの中間です。また、大量のデータがあり、手動で設定したマップ数が少なすぎるとディスクへの流出が減少します(タスクが多すぎるとJVMの起動/停止に時間がかかりすぎます)。ストリーミングジョブは、Python/Perl VMを起動する追加のオーバーヘッドを持ち、データがJVMとスクリプティングVMの間でコピーされます。
+0

ありがとう!私はすでにプレーンテキストの入出力要件を持っているので、カスタム入力フォーマットは私の場合とは無関係です。 ブタの評価では、私はむしろそれから離れているかもしれないと私に伝えます。私は既にPythonの実装を持っています。 私のスクリプトはCPUを大量に消費します。彼らはちょうど標準入力から読んで、いくつかの番号をクランチし、結果を出力します。しかし、それは私のHadoopの仕事がCPUバウンドとみなせるかどうかは分かりません。いずれにしても、私が本当に尋ねたかったのは、ジョブがCPUバウンドかIOバウンドかどうか、そしてそれがカスタムjarまたはストリーミングジョブとして実装されているかどうかの相互作用でした。 –

+0

Maps and Reduceタスクが独自のJVM上で実行されていることと、mapおよびreduce関数がCPUバウンドであるという事実を考慮すると、これらの個々のHadoopタスクはCPUに束縛されます。 HadoopジョブのコーディネーティングJVMは、データをマップに送信してレイヤーを削減する個々のタスクからの応答を待っているため、ほとんどの場合IO集中型です。 –

+0

実際には、マップと縮小タスクが実行されているJVMもIO(HDFSからの入力でストリーミングを行い、出力をHDFSに書き込む)を処理することに気付きました。 hadoopはマップ関数がデータのどこに近いかを保証するので、一般的にかなり高速です(これはreduce関数には当てはまりません)。 –

関連する問題