web-dev-qa-db-ja.com

Java vs vs Python on Hadoop

私はHadoopを使用してプロジェクトに取り組んでいますが、ネイティブにJavaを組み込み、Pythonのストリーミングサポートを提供しているようです。いずれかの方法でパフォーマンスに大きな違いがある場合に、どちらの方法でも実行できるプロセス。

53
jnoss

Javaは、Pythonよりも動的ではないため、VMにより多くの労力が注がれ、より高速な言語になりました。Pythonつまり、単一プロセスのスレッドを異なるコアにプッシュすることはできません。

これが大きな違いを生むかどうかは、あなたが何をしようとするかにかかっています。私は両方の言語があなたのために働くと思う。

15
David Crawshaw

Pythonを使用すると、おそらくより高速に開発され、Javaを使用すると確実に高速に実行されます。

Googleの「ベンチマークゲーム」は、すべての一般的な言語間で非常に正確な速度の比較を表示したいが、正しく思い出せば、3〜5倍高速です。

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


コメントへの返信(どのようにしてJavaがPythonより高速になりますか):

すべての言語は異なる方法で処理されます。 Javaは、C C++の後に最も高速です(Javaよりも高速または最大5倍高速になりますが、平均して約2倍高速になります)。残りは2〜5倍以上遅くなります。 Pythonは、Javaの後の高速なものの1つです。 C#はJavaとほぼ同じかそれより高速かもしれませんが、ベンチマークゲームにはWindowsで実行しないため、Monoしかありませんでした(少し遅い)。

これらの主張のほとんどは コンピューター言語ベンチマークゲーム に基づいています。これは、各言語の支持者/専門家が特定の言語で書かれたテストを微調整して、コードが適切にターゲットされるようにするため、かなり公平になる傾向があります。

たとえば、 this はJava vs c ++を使用したすべてのテストを示し、速度範囲はJavaとほぼ同じで、3倍遅くなります(最初の列は1および3)、およびJavaはより多くのメモリを使用します!

このページ はJava vs pythonを示します(Pythonの観点から)。そのため、速度の範囲はpythonからJavaより2倍遅く、174倍遅く、pythonは一般にコードサイズとメモリ使用量でJavaに勝ります。

ここで別の興味深い点-大量のメモリを割り当てたテストJavaは、実際にメモリサイズでもPythonよりも大幅に優れたパフォーマンスを発揮しました。 Javaは通常、VMのオーバーヘッドのためにメモリを失うと確信していますが、それを考慮すれば、Javaはおそらく(Cを除く)よりもおそらく効率的です。

ちなみに、これはPython 3です。テストされた他のpythonプラットフォーム(Pythonと呼ばれる)の方がはるかに悪かったです。

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

私は、Agilentのシグナルアナライザー(高価なo-scopeを考えてください)に取り組みました。そこでは、ほぼすべて(サンプリングを除く)がJavaで行われました。これには、トレース(AWT)を含む画面の描画とコントロールとの対話が含まれます。

現在、私はすべての将来のケーブルボックスのプロジェクトに取り組んでいます。このガイドは、他のほとんどのアプリとともにJavaで作成されます。

なぜPythonよりも速くないのでしょうか?

24
Bill K

Hadoop mapreduce変換は、「ストリーミング」または「カスタムjar」として作成できます。ストリーミングを使用する場合、PythonまたはC++を含む、好きな言語でコードを記述できます。コードはSTDINから読み取り、STDOUTに出力します。ただし、0.21以前のhadoopバージョンでは、 hadoopストリーミングは、バイナリではなくテキストのみをプロセスにストリームするために使用されていたため、ファンキーなエンコード変換を自分で行わない限り、ファイルはテキストファイルである必要がありましたが、今では patch が追加されているようですhadoopストリーミングでバイナリ形式を使用できるようになりました。

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

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

しかし、あなたは自分の時間の価値を自問する必要があります。私は自分自身をPythonではるかに生産的にしており、STDINを読み取り、STDOUTに書き込むmap-reduceを書くのは本当に簡単です。だから私は個人的にpythonルート-自分でバイナリエンコーディングを理解する必要がある場合でも。hadoop0.21は非utf8バイト配列を処理し、バイナリ(byte配列)python( http://dumbotics.com/2009/02/24/hadoop-1722-and-typed-bytes/ ))に使用する代替これは、pythonコードが「カスタムjar」よりも約25%だけ遅いことを示しています。Javaコード、私は間違いなくpythonルート。

14
John Prior