2009-09-26 15 views
51

私はHadoopを使ってプロジェクトを進めており、Javaをネイティブに組み込み、Pythonのストリーミングサポートを提供しているようです。どちらか一方を選択すると、パフォーマンスに大きな影響がありますか?私は、いずれかの方法で大きなパフォーマンスの違いがある場合はどちらか一方に進むことができるほど早い段階にあります。Java対Python on Hadoop

+0

今年はDEFCONでHadoopにセッションがありました。彼らはPythonが驚くほどうまくいくことを示しましたが、I/O-boundタスクを実行していたようです。私の理解は、Pythonとの統合は、別のプロセスを開始し、データをテキストとしてストリーミングすることです。タスクによっては、問題がある場合としない場合があります。 –

+0

マップ/リダクション処理でキーを処理するのに時間がかかる場合、ストリーミングには他の問題がある可能性があります。ネイティブJavaマッパー/レデューサーは、ジョブトラッカーに通知するためにハートビートを送信できますが、ストリーミングマッパー/レデューサーにはそのような機能はありません。 – phsiao

+5

これは一般に、タスクがIOまたはCPUにバインドされているかどうかによって異なります。 IOバインドされたタスクのIMOには、使用する言語の違いはほとんどありません。しかし、CPUの束縛されたタスクのために、あなたがJavaのために得ることができるすべてのパワーを望むならば、より速い開発時間のためにパワーのいくつかを惜しみなく使うことができれば、Pythonに向かいます。 – wlk

答えて

13

JavaはPythonより動的ではなく、より多くの努力がVMに追加され、より高速な言語になりました。また、PythonはGlobal Interpreter Lockによって保持されています。つまり、単一のプロセスのスレッドを別のコアにプッシュすることはできません。

これが大きな違いになるかどうかは、実行する予定によって異なります。私は両方の言語があなたのために働くと思う。

+6

しかし、Pythonは複数のコアに対して非常に優れたマルチプロセスをサポートしています – cobbal

+0

グローバルインタプリタのロックによってマルチコアサポートがほぼ完了したと聞きましたが、これは私が聞いた正確な場所を覚えていないので、塩の。 –

+2

マルチコアプロセスのものは並列のpythonモジュールで使用できます。このモジュールを使用すると、プロセスをクラスタ内の他のマシンにプッシュすることもできます。非常にきちんとした、簡単です。 – whatnick

24

Pythonを使用すると、おそらくより速く開発でき、Javaでは間違いなくより高速に実行できます。

すべての一般的な言語の間で非常に正確な速度の比較を表示したい場合はGoogleの「ベンチマークゲーム」が正しくリコールされていれば3-5倍高速です。

しかし、最近はプロセッサに縛られているものはほとんどないので、Pythonでより良く開発したいと思ったら、それを試してみてください!

コメントに返信するには

(どのようにJavaのは、Pythonよりも速くすることができます):

すべての言語が異なる方法で処理されます。 JavaはC & C++(Javaよりも高速または最大5倍高速かもしれませんが、平均で2倍速くなります)の後で最も高速です。残りは2〜5倍遅くなります。 PythonはJavaに次ぐ高速版の一つです。私はC#がJavaほど早いか高速かもしれないと思っていますが、ベンチマークゲームはMono(これは少し遅いです)を持っています.Windowsで実行しないからです。

これらの主張のほとんどはcomputer language benchmarks gameに基づいていますが、各言語の/専門家を擁護する人は特定の言語で書かれたテストを調整して、コードのターゲットを絞っているためです。

たとえば、thisは、Java対C++でのすべてのテストを示しています。javaとほぼ同等から3倍速い(最初の列は1〜3)の速度範囲を見ることができます。

this pageは、Java対Python(Pythonの観点から)を示しています。したがって、速度はPythonがJavaより2倍遅く、Pythonが一般的にJavaのコードサイズとメモリの使用量を上回ります。

もう1つの興味深い点は、メモリが大量に割り当てられたテストで、Javaは実際にPythonよりもメモリサイズが大幅に優れていたことです。私はかなりVMのオーバーヘッドのためにJavaがメモリを失うのは間違いないと思っていますが、一旦その要因が取り除かれると、おそらくJavaはたぶんCよりも効率的です。

これはPython 3のところであり、他のPythonプラットフォーム(Pythonと呼ばれています)がテストされています。

実際にを知りたい場合は、の方が速いのですが、VMは驚くほど知的です。これは、コードを実行した後に機械語にコンパイルするので、最も可能性の高いコードパスが何であり、最適化されているかがわかります。メモリ割り当ては芸術であり、OO言語では本当に便利です。これは、VM以外の言語では実行できない素晴らしいランタイム最適化を実行できます。C/C++と組み込みデバイスの選択に使用される言語であり、非常に小さなメモリフットプリントで実行できます。

私は、サンプリングを除いてほぼすべてがJavaで実行されていたAgilentのシグナルアナライザ(高価なoスコープと考える)で作業しました。これには、トレース(AWT)を含む画面の描画とコントロールの操作が含まれます。

現在、今後のすべてのケーブルボックスのプロジェクトに取り組んでいます。ガイドは他のほとんどのアプリと一緒にJavaで書かれています。

なぜPythonより速くないのですか?

+0

JavaはどのようにしてPythonより高速になりますか?そこに抜粋はありますか?ありがとう。 –

+0

要約を忘れることなく、より多くのJavaプログラムがquadcoreを使用するように変換されている可能性があることに留意してください。http://shootout.alioth.debian.org/u32/indexも参照してください。 PHP – igouy

+0

興味深い。私は最悪のパフォーマンスを誇るJavaプログラム(ツリー1)を見て、それがマルチスレッドではないことに気付きましたが、あなたは正しいです - 他の多くの言語はシングルスレッドモードで驚くべきショーを行います。無料パスカル?エイダHmph –

14

「ストリーミング」または「カスタムjar」のいずれかとして、Hadoopマップ変換の変換を記述することができます。ストリーミングを使用する場合は、PythonやC++など好きな言語でコードを書くことができます。あなたのコードはSTDINから読み込まれ、STDOUTに出力されます。しかし、hadoopのバージョンが0.21より前のバージョンでは、hadoopストリーミングはバイナリではなくテキストのみをプロセスに流すために使用されていました。そのため、ファイルをテキストファイルにする必要がありました。しかし、現在は、patchが追加されており、これでハープ・ストリーミングでバイナリ・フォーマットを使用できるようになりました。

「カスタムjar」(つまり、hadoopライブラリを使用してJavaまたはScalaでマップ還元コードを書いた)を使用すると、バイナリの入出力(バイナリでのシリアル化)を可能にする関数にアクセスできますあなたのストリーミングプロセス(および結果をディスクに保存)したがって、バイナリ形式がテキスト形式よりもどれだけ小さいかによって、将来の実行速度がはるかに高速になります。

hadoopジョブがI/Oバウンドになる場合、「カスタムjar」アプローチは高速になります(以前のポスターと同じようにJavaが高速であり、ディスクからの読み取りも高速になるため)。

しかし、自分の時間がどれほど貴重なのか自分に尋ねなければなりません。私は自分自身がPythonではるかに生産的であり、STDINを読み、STDOUTに書き込むmap-reduceを書くことは本当に簡単です。だから私は個人的にはPythonのルートに行くことをお勧めします。 hadoop 0.21は非utf8バイト配列を扱うので、Pythonコード( "http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/")にはバイナリ(バイト配列)の代わりがあります。これは、Pythonコードが「カスタムjar」Javaコードより約25%遅いことを示しています。間違いなくPythonのルートに行きます。