2013-08-17 48 views
1

ChainMapper.addReducer & addMapper的第7個參數是傳遞數據作爲值或引用。 我不明白如何將數據作爲參考傳遞,如果reducer可以在與映射器不同的機器上運行。hadoop如何通過引用傳遞?

的Hadoop專家敬請回復

回答

2

ChainMapper轉換之前或MapperReducer後添加額外的。它發生在工人的本地計算中。沒有任何關於此的要求將鍵和值序列化,發送到另一臺機器並再次處理。它只是在線發生。

這就是爲什麼這可能會令人困惑,因爲我們不習慣Mapper看到字面上由另一個操作輸出相同的對象。這將是更有效率的事情,通過引用傳遞。但有可能代碼假定它是有價值的,因爲否則Hadoop以這種方式工作。例如,您可能會認爲您可以修改鏈接Mapper中的鍵或值對象的狀態,並且在它觀察到該更改之前非常驚訝地發現Reducer。 (但我認爲這是糟糕的設計。)

所以這個參數控制Hadoop是否只是序列化和反序列化對象 - 基本上,通過序列化創建一個克隆。這是額外的工作。

byValue參數不存在於較新的Hadoop API中。默認值是true,除非你知道更好,否則你可能會堅持。如果您確定不修改鍵/值對象狀態,則可以安全地使用false,並通過引用傳遞獲得一點速度。

當然,它總是讓人困惑,因爲Java始終是一種傳值語言。但是對象永遠不會按值傳遞,而是通過值傳遞對象引用。當然Java在這方面不會改變。

+0

我很榮幸歐文先生有時間回答我的問題。這是一個很好的答案。你能不能分享一些我可以找到更多細節的指針? –