2012-03-05 25 views
6

到目前爲止,我一直在使用Pig或Java進行Map Reduce專門用於針對Hadoop集羣運行作業。我最近試用了通過Hadoop流式處理Python Map Reduce,這也很酷。所有這些對我來說都是有意義的,但是當我想要使用一個執行訴訟時,我有點朦朧。另一個。 Java map reduce,我基本上只在需要速度時才使用,但是我什麼時候會想使用Python流,而不是在PIG/Hive中使用更少,更容易理解的行寫出相同的內容?總之,每個人有什麼優點和缺點?使用各種語言在Hadoop中執行作業的優點和缺點是什麼?

+0

如果您投票並投票結束,爲什麼不添加評論並提出原因,這樣我就不會做任何你認爲我將來做錯了的事情? – Eli 2012-03-05 18:58:01

+0

http://lucene.472066.n3.nabble.com/Comparison-of-Apache-Pig-Vs-Hadoop-Streaming-M-R-td3792556.html是此討論的相關主題。 – Eli 2012-03-05 20:40:12

回答

3

我將分別涉及到Java VS Python的,然後分別涉及MR VS蜂巢/豬 - 因爲我認爲這是兩個不同的問題
Hadoop是圍繞Java構建和很多通過Java API的功能可用,和Hadoop大多可以使用java類進行擴展。

Hadoop能夠使用其他語言創建的MR作業 - 它被稱爲流式傳輸。這個模型只允許我們定義mapper和reducer,並且有一些在java中不存在的限制。在同一時間 - 輸入/輸出格式和其他插件必須寫成java類
所以我將定義如下的決策: a)使用Java,除非你有嚴肅的代碼庫,你需要在你的MR作業。 b)考慮在需要創建一些簡單的臨時作業時使用python。

關於Pig/Hive - 它也是以Java爲中心的更高級別的系統。 Hive可以在沒有任何編程的情況下使用,但可以使用java進行擴展。豬從一開始就需要java。我認爲這個系統在可以被應用的情況下總是比MR工作更可取。通常情況下,這些是處理SQL時的情況。

流與原生Java之間的性能考慮因素。
通過輸入流將輸入流輸入到映射器。它是進程間通信,在Java的情況下,在記錄讀取器和映射器之間進行數據傳遞時,它本質上效率較低。
我可以從上面得出如下結論: a)如果進行一些輕量級處理(如查找子字符串,計數...),此開銷可能非常重要,Java解決方案將更有效。
b)如果某些繁重的處理可以更有效地用某種非Java語言實現 - 基於流的解決方案可能會有一些優勢。

豬/蜂巢性能考慮因素。 Pig/Hive都實現了SQL處理的基元。換句話說 - 他們在RDBMS世界中實施執行計劃的元素。這些實現很好,並且很好調整。在同一時間Hive(我知道更好)是解釋器。它不會執行代碼生成 - 它將預先構建的MR作業中的執行計劃集成在一起。這意味着如果你有複雜的條件並且會爲他們專門編寫代碼 - 它有可能比Hive做得更好 - 代表編譯器vs中間件的性能優勢。

+0

謝謝!這很棒!你還可以寫更多關於速度比較的機會嗎?我無法找到太多的流媒體資料。我想更多關於這方面的信息會使這個完美的答案! – Eli 2012-03-05 18:57:06

+0

你是說流媒體和普通Java MR作業或Java vs Hive/Pig之間的速度比較? – 2012-03-05 20:05:31

+0

Java MR v.s.腳本語言MR over streaming v.s. PIG介紹的開銷很有意思。 – Eli 2012-03-05 20:29:40

2

關於Java與豬 - 我會在大多數情況下(與Java UDF一起)使用豬的靈活性,並讓其他人(豬)找出將工作分解爲映射並減少的最佳方法,combiners等

我使用Java時,我絕對要控制作業的每一個方面。

關於使用python(或其他語言),這是我會用的,如果開發人員更適應這些其他語言。請注意,你也可以mix pig and streaming

1

斯卡拉,在那裏你可以爲你的工作寫更簡單的代碼。例如,檢查出:https://github.com/NICTA/scoobi

你也許能有一些鼓勵使用C++對於那些更多的內存或CPU密集型任務。你可以讀什麼Hypertable的寫了一篇關於他們的C++決定:http://code.google.com/p/hypertable/wiki/WhyWeChoseCppOverJava

的Java也對系列化側有問題的,因爲它爲它從輸入流中讀取任何對象創建一個對象。你需要小心不要使用Java序列化,只是因爲你有Java實現。

相關問題