2011-07-29 24 views
10

我正在使用Python編寫的映射器和簡化器在Hadoop(在Amazon的EMR上)中運行流式作業。如果我在Java中實現相同的映射器和簡化器(或使用Pig),我想知道速度增益。Hadoop中的流式傳輸或自定義Jar

特別是,我正在尋找人們從流式傳輸到定製jar部署和/或Pig以及包含這些選項基準比較的文檔的體驗。我發現這個question,但答案不夠具體。我不想在Java和Python之間進行比較,而是在Hadoop中的自定義jar部署和基於Python的流之間進行比較。

我的工作是閱讀NGram從Google圖書NGgram數據集計算和計算聚合度量。看起來計算節點上的CPU利用率接近100%。 (我希望聽到您對CPU限制或IO限制作業的差異的意見)。

謝謝!

Amaç

回答

4

爲什麼要考慮部署自定義罐子?

  • 能夠使用更強大的自定義輸入格式。對於流式作業,即使您使用可插拔輸入/輸出(如here),您僅限於作爲文本/字符串的映射器/縮放器的鍵和值。您需要花費一些CPU週期來轉換爲您所需的類型。
  • 香港專業教育學院還聽說的Hadoop能夠智能地重複使用跨多個職位的JVM流時不會成爲可能(不能確認這一點)

當使用豬?

  • Pig Latin非常酷,是比java/python或perl更高級的數據流語言。你的豬腳本往往比編寫任何其他語言的同等任務要小得多

什麼時候不使用豬?

  • 儘管豬是相當不錯的,在自身找出多少地圖/減少以及何時產生一個地圖或減少與這樣的事情萬千,如果你死了知道有多少地圖/減少需要和你需要在你的Map/reduce函數中做一些非常具體的計算,並且你對性能非常具體,那麼你應該考慮部署你自己的jar。這link表明,豬可以滯後本機hadoop M/R的表現。你也可以看看編寫自己的豬UDFs其隔離一些計算密集型功能(甚至可能使用JNI調用一些本地C/C++的UDF中的代碼)的IO和CPU綁定作業

的注:

  • 從技術上講,hadoop和map reduce的全部重點是並行化計算密集型功能,所以我認爲你的map和reduce jobs是計算密集型的。當數據通過網絡發送時,Hadoop子系統忙於做IO的唯一時間是在映射和縮減階段之間。另外,如果您有大量數據,並且手動配置了太少的映射並減少了導致磁盤溢出的問題(儘管太多任務會導致啓動/停止JVM和太多小文件花費太多時間)。流式作業還會產生額外的開銷,即啓動Python/Perl VM並在JVM和腳本VM之間來回複製數據。
+0

謝謝!由於我已經有純文本輸入/輸出要求,所以自定義輸入格式與我的情況無關。 豬的評價告訴我,我寧願遠離它。我已經有了Python實現。 我的腳本是CPU密集型的。他們只是從標準輸入中讀取數據,進行一些數字運算,然後輸出結果。但我不確定這是否意味着我的Hadoop作業整體可以被視爲CPU限制。無論如何,我真正想問的是作業是CPU限制還是IO限制,以及它是作爲自定義jar還是流式作業實現的。 –

+0

考慮到您的Maps和Reduce任務將在其自己的JVM上運行,以及通常map和reduce函數受CPU限制的事實,這些單獨的Hadoop任務將受CPU限制。 Hadoop作業的協調JVM很可能是IO密集型的,因爲它忙於等待來自將任務發送到map和reduce層的單個任務的響應。 –

+0

實際上,我剛剛意識到,map和reduce任務運行的JVM也處理一些IO(從HDFS輸入流並將輸出寫入HDFS)。由於hadoop確保map函數接近數據的位置,所以通常非常快(對於reduce函數,這是不正確的)。 –