2013-03-20 50 views
0

爲了避免在一個Hadoop Mapper類的每個實例分配內存,然後依靠GC清理這個內存我用我訪問讀取並在map方法寫靜態對象。擁有映射類是線程安全的

我一定要關心線程安全?

+0

這聽起來像過早優化對我來說,你確定你真正需要的多線程,如果你已經在使用Hadoop來分發處理的負荷? – Quetzalcoatl 2013-03-20 16:56:18

+0

我不想使用多線程。我害怕hadoop可以在內部使用線程,並想知道Mapper的一個實例訪問某個靜態變量是否安全。 – ngrislain 2013-03-20 17:21:14

+0

好吧,如果你在分佈式模式下運行,這些都將是不同的機器,所以靜態對象不會給你帶來任何好處,因爲Enno Shioji說。即使在僞分佈式模式下,它也應該在它自己的JVM中,所以同樣適用。 – Quetzalcoatl 2013-03-20 17:24:58

回答

3

默認情況下,每一個地圖的任務將在其自己的JVM上運行。所以你不會從使用靜態對象中獲得任何好處。我會建議不要做一些奇怪的事情,除非你真的面對性能問題。

+0

儘管Hadoop可以重用JVM,並且Mapper對象可用於下一個地圖任務,但的確如此。那麼跨越其生命週期方法緩存一些數據可能會有好處。這也意味着您必須在生命週期方法中正確地初始化和清理,而不是構造函數 – 2013-06-11 22:46:08

1

添加到什麼恩諾和羽蛇神說。 作爲當曾經映射任務在JVM運行時,它創建映射器類的單個對象,並調用圖FN爲每個輸入(即,用於使用的TextInputFormat當一個文件的每行)。 但它按順序調用映射fn,而不是並行調用。 因此,您正在使用的對象應該沒有線程安全問題。

問候, 馬尼什