天天看點

MapReudce源碼分析之Mapper

        Mapper是MapReduce程式設計模型中一個将輸入的key/value對映射成一組中間key/value對的元件。Map是将輸入記錄轉換成中間記錄的單個任務。被轉換的中間記錄不需要與輸入記錄一樣的類型。一個給定的輸入對可能被映射成0個貨多個輸出對。Hadoop的MapReduce架構為作業中輸入格式InputFormat産生的每個輸入分片InputSplit産生一個Map任務。通過JobContext的getConfiguration()方法,Mapper的實作者可以獲得任務的配置資訊。MapReduce架構中Map部分首先會調用setup()方法,然後接着為輸入分片的每個KeyValue對調用map()方法進行處理,最見後再調用cleanup()方法。所有給定輸出key相關的中間值随後會被架構進行分組,繼而被傳遞給Reducer以确定最終的輸出。通過指定兩個關鍵的RawComparator類,使用者可以控制排序和分組。Mapper輸出被每個Reducer分區。通過實作一個定值分區器Partitioner,使用者可以控制哪些key和相關記錄進入哪個Reducer。

        Mapper的執行主流程在其run()方法内,代碼如下:

        run()方法執行的流程很簡單,大體如下:

        1、task開始運作時setup()初始化方法;

        2、在try子產品中,當context中仍有KeyValye對的話,一直循環:

              取出context中目前key、valye,連同context本身,調用map()方法處理;

        3、在finally子產品中,task結束運作時調用cleanup()方法進行清理 。

        是不是很簡單,就像一個模闆一樣,按照setup()--map()--map()--......--map()--cleanup()的執行主線運作。而且,熟練或者老練的使用者可以覆寫該方法,以便更完整的控制Mapper的運作。

        我們接下來再看下進行初始化的setup()方法和進行清理的cleanup()方法,代碼如下:

        這兩個函數分别在task開始運作或結束運作時調用一次,一遍完成初始化或清理工作,使用者可覆寫這兩個方法,以便實作自己的初始化或清理邏輯,或者,幹脆不用管,那麼這兩個方法是空方法,什麼都不會做。

        再來看下實作KeyValue對轉換的核心功能map()方法,代碼如下:

        map()方法針對輸入分片split的每個key/value對都會調用一次。大多數應用程式應該覆寫該方法,而預設實作是一個類似恒等式的功能,原樣輸出key、value。

        另外,Mapper中還有一個抽象内部類Context,它實作了MapContext接口,代表了Map任務運作時的上下文資訊,我們後續再講。

繼續閱讀