2013-05-02 55 views
5

Hadoop框架調用的mapper或reducer類的run()方法如何?該框架調用run()方法,但它需要一個上下文對象,那麼Hadoop如何傳遞該對象?什麼信息存在於那個對象中?Hadoop映射器上下文對象

回答

3

run()方法將使用Java運行時多態(稱爲方法重寫)來調用。正如您可以在下面的鏈接中看到#569行,擴展映射器/縮減器將使用Java Reflection API進行實例化。所述MapTask類獲取從作業配置對象擴展映射器/減速器其中,客戶端程序將已經被配置擴展使用job.setMapperClass()

以下映射器/減速器類的名稱從Hadoop Source MapTask.java

mapperContext = contextConstructor.newInstance(mapper, job, getTaskID(), 
                input, output, committer, 
                reporter, split); 

    input.initialize(split, mapperContext); 
    mapper.run(mapperContext); 
    input.close();` 
採取的代碼

#621行是運行時多態性的一個例子。在這一行上,MapTask以'Mapper Context'爲參數調用配置的映射器的run()方法。如果run()未被擴展,它會調用org.apache.hadoop.mapreduce.Mapper上的run()方法,該方法再次在配置的映射器上調用map()方法。

在上述鏈路的線路#616,MapTask創建具有工作配置等的所有細節的上下文對象作爲由@harpun提及並然後傳遞到run()方法在線路#621

上面的解釋適用於減少任務以及相應的ReduceTask類作爲主要入門級。

+0

感謝niranjan可以在你運行任何簡單的工作時解釋所有hadoop框架類的執行情況? – 2013-05-03 04:42:13

+0

這不是一個簡單的答案。有很多hadoop框架類參與其中,在擴展類被調用之前,真正的整個軟件層都被執行了。我建議下載並將hadoop源文件附加到IDE中,然後調試任何作業以瞭解調用堆棧中使用的高級類。 – 2013-05-06 15:15:45

+0

@NiranjanSarvi,你能告訴我們MapTask類是如何創建其他類的上下文類的對象的嗎?在MapTask類和Context類之間是否有任何關係,因爲在庫中Context類是一個抽象類,甚至沒有被Maptask類實現?它來自其他方式嗎? – Kate 2017-10-22 09:28:03

0

是的,映射程序的run()方法在運行地圖任務嘗試時由MR框架調用。就上下文而言,請查看Mapper.Context的文檔,特別是已實現的接口及其javadoc可以全面瞭解上下文中包含的信息。通過上下文,你可以訪問諸如數據:

  • 作業信息(作業配置,映射器/減速的類名,作業名稱,工作目錄)當前執行的任務試圖
  • 當前關鍵的
  • 狀態,值,輸入分割(地圖任務特定信息)

當然存在Reducer類似的上下文對象:Reducer.Context