2012-10-17 78 views
2

我在我的地圖中有一個靜態對象reduce作業類,我想初始化一次(在主要方法中),然後在每個映射中調用一個函數。所以我有這樣的對象,myObject的,我宣佈一個變量:Hadoop Map減少引用靜態對象

static MyObject obj; 

而且在我的主要功能,在我開始工作,我呼籲:

obj = new MyObject(); 
obj.init(); 

然後在我的地圖功能我想打電話:

obj.execute(); 

但由於某種原因,我得到一個空指針異常,當我嘗試這個(它表示obj爲空)。如果我初始化它在我的主要功能,不應該映射器看到它初始化?映射器是否可以看到靜態變量?

+0

你是試圖在分佈式系統上還是在單個系統? – banjara

+0

分佈式系統 – user1482350

回答

7

靜態對象駐留在內存中。 現在你的系統被分配了一個 所以你創建的對象在你的jobtracker運行的節點的內存中,而不是在其他系統上運行。

現在你不能從任務傳遞對象映射器,因爲配置寫爲XML,但有一種變通方法,序列化你的對象成JSON,然後把它作爲字符串在配置和映射器反序列化這個JSON對象

作業

job.getConfiguration().set("some key", "json string") 

的映射

Configuration conf = context.getConfiguration(); 
conf.get("some key"); 
3

你的main()沒有得到每個節點上調用,它只有在你啓動的作業運行。爲了訪問你的靜態對象,它需要在映射器的實例化處初始化。這樣,初始化將發生在運行地圖任務的每個節點上。

但是,可能有另一種方法來做你想要完成的事情,所以問題是,這個靜態對象是做什麼的?

0

由於我的對象實際上是加載一個庫,我最終使用分佈式緩存,並只是在M/R方法中實例化對象。