2013-01-07 47 views
1

我有一個要求,我想分享一個映射器和減速器類之間的變量。 情景如下: -如何在Mapper和Reducer類中共享一個變量?

假設我的輸入記錄類型爲A,B和C.我正在處理這些記錄,並相應地爲map函數中的output.collect生成鍵和值。但同時我還在mapper類中聲明瞭3個靜態int變量,以保持記錄A,B和C的類型的計數。現在,這些變量將由各種地圖線程更新。當所有的地圖任務完成後,我想將這三個值傳遞給Reduce函數。

這是如何實現的?我嘗試重寫close()方法,但是在所有地圖函數執行完畢後,將在每個地圖函數執行後調用它。或者有沒有其他的方式來分享變量。我希望輸出每種記錄的總數以及我顯示的任何處理輸出。

回答

3

計數器出於特定的原因,即。以保持某些特定狀態的計數,例如「NUMBER_OF_RECORDS_DISCARDED」。我相信只有增量這些計數器並沒有設置爲任意值(我可能在這裏是錯誤的)。但是確定它們可以用作消息傳遞者,但是有一個更好的方法,那就是使用作業配置來設置變量並且無縫地進行。但是,這隻能用於將自定義消息傳遞給映射器或縮減器,並且映射器中的更改將無法在reducer中使用。

使用舊設置消息/可變mapred API

JobConf job = (JobConf) getConf(); 
job.set("messageToBePassed-OR-anyValue", "123-awesome-value :P"); 

使用新的MapReduce API設置消息/變量:

Configuration conf = new Configuration(); 
conf.set("messageToBePassed-OR-anyValue", "123-awesome-value :P"); 
Job job = new Job(conf); 

使用獲取消息/變量Mapper和Reducer中的舊API: configure()必須在Mapper和Reducer類和值可能會被分配給一個類成員,以便在內部使用map()reduce()

... 
private String awesomeMessage; 
public void configure(JobConf job) { 
    awesomeMessage = Long.parseLong(job.get("messageToBePassed-OR-anyValue")); 
} 
... 

變量awesomeMessage然後可以與地圖和減少功能一起使用。

使用新的API中的映射和減速獲取消息/變量: 類似的事情必須在設置()在這裏完成。

Configuration conf = context.getConfiguration(); 
String param = conf.get("messageToBePassed-OR-anyValue"); 
+2

我敢肯定你不能傳遞映射器設置減速機配置狀態 - 工作的conf複製並更新各的map/reduce任務,並在每個任務的最終配置不「解析'並保存回作業追蹤器供以後使用。因此,儘管您可以在作業提交時設置配置,但無法全局更新或保留map/reduce任務中的新值 –

+0

我正在使用其映射函數沒有上下文的org.apache.hadoop.mapred.Mapper;但記者的對象。 – Nilesh

+0

是的,謝謝你指出克里斯。你是絕對正確的。我的錯。 – Amar

1

得到了解決方案。

用過的計數器。記者級在Mapper和Reducer中都可以訪問。