2012-07-19 100 views

回答

14

將映射器和reducer類聲明爲另一個類的內部類時,必須將它們聲明爲靜態,以使它們不依賴於父類。

Hadoop使用反射爲每個映射或減少運行的任務創建類的實例。創建的新實例需要一個零參數構造函數(否則它將如何知道要傳遞什麼)。

通過聲明沒有static關鍵字的內部映射器或reduce類,java編譯實際上會創建一個構造函數,該構造函數需要在構造時傳入父類的實例。

您應該能夠通過對運行javap的命令來查看這個生成的類文件

而且,在父類中聲明使用時(這就是爲什麼你永遠看不到它在頂部的static關鍵字無效但只在子類中)

+0

謝謝。其實你對反射的解釋解決了我的一些其他問題。 – kee 2012-07-20 04:56:51

+0

@Chris White你真是太好了。 – 2016-11-16 09:26:13

1

我能想到的原因有兩個:

  1. 當執行的map-reduce方法沒有狀態需要其在對象被保留。因此所有必要的信息都被傳遞給方法,不需要在對象中存儲額外的數據。如果該對象的生命時間不會超過一個方法調用,爲什麼你應該通過實例化來掙扎呢?
  2. 它有多個對象是沒有意義的,類似的原因,你會實現​​。
+0

這是不正確的 - 在map-reduce中,會創建Mapper類的幾個具體實例;他們確實可以保持狀態。我猜「靜態」的含義在Java中與例如C#。 – 2014-02-05 00:47:29

相關問題