2013-02-12 22 views
5

我試圖在Hadoop中做一些簡單的事情,發現在編寫映射器和reducer時都被定義爲static。我的任務將被分解成幾個map零件和一個最終的reduce。如果我想在其他工作中重新使用我的映射器,該怎麼辦?如果我將我的映射器類定義爲內部static,我可以在其他工作中使用它嗎?另外,非平凡的問題可能需要更多更復雜的映射器,因此將它們全部放在一個巨大的文件中會在維護時變得糟糕透頂。Hadoop中的Mappers and Reducers必須是靜態類嗎?

是否有任何方法可以將mappers和reducer作爲常規類(甚至可以在單獨的jar中)而不是作業本身?

回答

8

是你的問題是否該類必須是靜態的,可能是靜態的,也可能是內部的,或者應該是內部的?

Hadoop本身需要能夠通過反射來實例化您的MapperReducer,因爲給定Job中配置的類引用/名稱。如果它是一個非靜態的內部類,這將失敗,因爲一個實例只能在Hadoop不知道的其他一些類的上下文中創建。 (除非內部類擴展它的封閉類,我想。)

所以要回答第一個問題:它不應該是非靜態的,因爲這幾乎肯定會使它不可用。要回答第二個和第三個:它可以是一個靜態(內部)類。

對我來說,MapperReducer顯然是頂級的概念,值得一個頂級的課程。有些人喜歡讓他們內在靜止,將他們與「跑步者」類配對。我不喜歡這個,因爲它真的是子包裝的用途。你注意到另一個設計理由來避免這種情況對於第四個問題:不,我認爲內部班不是好習慣。

最後的問題:是的MapperReducer類可以在一個單獨的JAR文件中。您告訴Hadoop哪些JAR文件包含了所有這些代碼,這就是它將發送給工作人員的那個代碼。工人們不需要你的Job。然而,他們需要任何在其相同的JAR中依賴的任何東西。

1

我覺得上述答案非常精確,確實符合理論基礎。除此之外,我覺得在創建地圖和減少時應該利用內部類。國際海事組織,所有的代碼應該在一個地方。

在單個類中可以有效利用泛型,確保沒有類型轉換錯誤。

+0

這不是一個答案。如果你有足夠的聲譽,你可以留下評論。 – songyuanyao 2014-04-30 14:45:06

相關問題