2009-09-26 67 views
51

我正在使用Hadoop進行項目工作,它似乎本地合併Java併爲Python提供流式支持。是否有重大的性能影響選擇一個在另一個上?如果在某種程度上存在顯着的績效差異,那麼我可以在任何一種方式上都足夠早。Java與Hadoop上的Python

+0

今年在DEFCON舉行的Hadoop會議上。他們展示了一些令人驚訝的Python,但似乎在做一個I/O綁定的任務。我的理解是與Python的集成涉及開始一個單獨的流程和流文本數據流。根據任務的不同,這可能是也可能不是問題。 – 2009-09-26 22:08:53

+0

如果map/reduce進程需要很長時間才能處理密鑰,那麼流式傳輸可能會遇到其他一些問題。本地Java映射器/縮減器可以發送心跳來通知jobtracker,但流式映射器/縮減器不具備這種功能。 – phsiao 2009-09-27 14:27:58

+5

這通常取決於您的任務是IO還是CPU綁定。國際海事組織在IO界限任務中,你將使用什麼語言沒有多大區別。但是對於CPU綁定的任務,如果您希望獲得Java的所有能力,那麼如果您可以騰出一定的功耗來縮短開發時間,那麼可以使用Python。 – wlk 2010-06-21 12:37:01

回答

13

Java的動態性不如Python,並且已經投入更多精力投入其VM,使其成爲更快的語言。 Python也被全局解釋器鎖拒絕,這意味着它不能將單個進程的線程推到不同的核心上。

這是否有任何顯着的差異取決於你打算做什麼。我懷疑這兩種語言都適合你。

+6

python確實對多核心有很好的多進程支持 – cobbal 2009-09-26 22:13:28

+0

我聽說全局解釋器鎖定使多核心支持幾乎洗了一次,但我不記得我聽到的確切位置,所以把它與穀物鹽。 – 2009-09-26 23:47:48

+2

多核心進程可用於並行python模塊,該模塊還允許您將進程推送到羣集中的其他計算機。非常簡潔。 – whatnick 2009-09-27 03:19:30

24

使用Python,您可能會更快地開發,而Java將運行得更快。

谷歌「benchmarksgame」,如果你想看到所有流行語言之間的一些非常準確的速度比較,但如果我記得正確,你說的速度快3-5倍。這就是說,現在很少有東西是處理器綁定的,所以如果你覺得你可以用Python更好地開發,那就去吧!


在回覆評論(怎麼也比Java的Python會更快):

所有語言都不同的處理。 Java在C++之後是最快的(它可以比Java快5倍,但似乎平均快2倍)。其餘的速度慢了2-5倍。 Python是Java之後更快的一種。我猜C#跟Java一樣快,也許速度更快,但基準測試遊戲只有Mono(稍慢一些),因爲它們不會在Windows上運行。

大多數這些聲明都基於computer language benchmarks game,因爲這些聲明往往相當公平,因爲每種語言的倡導者/專家都會調整用特定語言編寫的測試,以確保代碼具有良好的針對性。

例如,this顯示了Java與C++的所有測試,並且您可以看到速度範圍從約等於java慢3倍(第一列在1到3之間),並且java使用更多內存!

現在this page顯示了java vs python(從Python的角度來看)。所以速度範圍從python比Java慢2倍到174倍,python通常會在代碼大小和內存使用方面擊敗java。

另一個有趣的地方在於 - 分配大量內存的測試,Java在內存大小方面實際上執行的性能明顯好於Python。我非常確定java通常會因虛擬機的開銷而失去內存,但一旦這個因素出來,java可能比大多數(再次,除了C)效率更高。

這是Python 3順便說一句,另一個測試過的Python平臺(剛纔稱爲Python)的表現更差。

如果你真的想知道如何它更快,虛擬機非常聰明。它編譯爲運行代碼之後的機器語言,因此它知道最可能的代碼路徑併爲其優化。內存分配是一門藝術 - 在面嚮對象語言中非常有用。它可以執行一些令人驚歎的運行時優化,而不是非VM語言可以做到的。它可以在強制時運行在很小的內存空間中,並且是嵌入式設備和C/C++的首選語言。

我曾在安捷倫的信號分析儀上工作(認爲昂貴的o-scope),其中幾乎整個事情(除了採樣)都是用Java完成的。這包括繪製包括跟蹤(AWT)的屏幕並與控件交互。

目前我正在爲所有未來的電纜箱項目工作。該指南與大多數其他應用程序將用Java編寫。

爲什麼它不會比Python更快?

+0

Java如何比Python更快?有什麼摘錄嗎?謝謝。 – 2009-09-27 07:23:14

+0

不要忽略您的總結,請記住,更多的Java程序可能已被轉換爲使用quadcore - 所以也請看一個核心測量 - http://shootout.alioth.debian.org/u32/index。 php – igouy 2009-09-29 00:03:07

+0

有趣。我曾經看過性能最差的java程序(樹型程序),並注意到它並不是多線程的,但你是對的 - 許多其他語言在單線程模式下做出了驚人的表現。免費帕斯卡?阿達???哼 – 2009-09-29 17:14:39

14

您可以將Hadoop mapreduce轉換寫成「streaming」或「custom jar」。如果您使用流媒體,您可以使用任何您喜歡的語言編寫代碼,包括Python或C++。您的代碼只會從STDIN讀取並輸出到STDOUT。但是,在0.21之前的hadoop版本中,hadoop流式傳輸僅用於將文本(不是二進制文件)傳輸到您的進程。因此你的文件需要是文本文件,除非你自己做一些時髦的編碼轉換。但現在看起來增加了一個patch,現在允許使用帶有hadoop流的二進制格式。

如果您使用「自定義jar」(即,您使用hadoop庫在Java或Scala中編寫了mapreduce代碼),那麼您將有權訪問允許您從二進制輸入和輸出二進制文件您的流式處理(並將結果保存到磁盤)。所以未來的運行速度會更快(取決於你的二進制格式比你的文本格式小)。所以如果你的hadoop工作將被I/O綁定,那麼「custom 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代碼比「custom jar」java代碼慢25%左右,所以我肯定會走蟒蛇路線。