天天看點

MapReduce源碼分析之InputFormat

        InputFormat描述了一個Map-Reduce作業中的輸入規範。Map-Reduce架構依靠作業的InputFormat實作以下内容:

        1、校驗作業的輸入規範;

        2、分割輸入檔案(可能為多個),生成邏輯輸入分片InputSplit(往往為多個),每個輸入分片InputSplit接着被配置設定給單獨的Mapper;

        3、提供記錄讀取器RecordReader的實作,RecordReader被用于從邏輯輸入分片InputSplit收集輸入記錄,這些輸入記錄會被交由Mapper處理。

        基于檔案的輸入格式的預設行為,作為代表性的子類FileInputFormat,基于輸入檔案的總大小(機關byte)來切分成邏輯輸入分片InputSplit。然而,輸入檔案的檔案系統資料塊大小,被用作輸入分片大小的上界。輸入分片大小的下界則可以在mapred-default.xml配置檔案中通過參數mapreduce.input.fileinputformat.split.minsize來配置。

        無疑,由于記錄界限應該被遵守,基于輸入大小的邏輯輸入分片不滿足很多應用。在這種情況下,應用不得不實作一個記錄閱讀器RecordReader,以便遵守記錄邊界,并提出一個面向記錄的邏輯輸入分片視圖給單個任務。

        InputFormat是一個抽象類,其中,實作分片的是getSplits()方法,其定義如下:

        getSplits()方法為作業在邏輯上切分輸入檔案集合 。每個輸入分片将會被配置設定給單個Mapper進行處理。注意,這個切分隻是對輸入進行邏輯上的切分,輸入檔案并不會在實體上被分割成塊。比如,一個分片可能是<輸入檔案路徑,起始位置,長度>元組。InputFormat也會建立記錄閱讀器RecordReader去讀取這個輸入分片InputSplit。

        而提供記錄閱讀器的是createRecordReader()方法,其定義如下:

        createRecordReader()方法為給定分片建立一個記錄閱讀器。在分片被使用之前,架構将調用RecordReader的initialize(InputSplit, TaskAttemptContext)方法完成初始化。它需要兩個參數:

        1、InputSplit split:需要被讀入的分片;

        2、TaskAttemptContext context:任務上下文,存儲了任務的相關資訊。