接下來咱們按照MapReduce過程當中數據流動的順序,來分解org.apache.hadoop.mapreduce.lib.*的相關內容,並介紹對應的基類的功能。首先是input部分,它實現了MapReduce的數據輸入部分。類圖以下:
類圖的右上角是InputFormat,它描述了一個MapReduceJob的輸入,經過InputFormat,Hadoop能夠:
html
l 檢查MapReduce輸入數據的正確性;java
l 將輸入數據切分爲邏輯塊InputSplit,這些塊會分配給Mapper;web
l 提供一個RecordReader實現,Mapper用該實現從InputSplit中讀取輸入的<K,V>對。apache
在org.apache.hadoop.mapreduce.lib.input中,Hadoop爲全部基於文件的InputFormat提供了一個虛基類FileInputFormat。下面幾個參數能夠用於配置FileInputFormat:
api
l mapred.input.pathFilter.class:輸入文件過濾器,經過過濾器的文件纔會加入InputFormat;微信
l mapred.min.split.size:最小的劃分大小;app
l mapred.max.split.size:最大的劃分大小;oop
l mapred.input.dir:輸入路徑,用逗號作分割。佈局
類中比較重要的方法有:
spa
protectedList<FileStatus> listStatus(Configuration job)
遞歸獲取輸入數據目錄中的全部文件(包括文件信息),輸入的job是系統運行的配置Configuration,包含了上面咱們提到的參數。
publicList<InputSplit> getSplits(JobContext context)
將輸入劃分爲InputSplit,包含兩個循環,第一個循環處理全部的文件,對於每個文件,根據輸入的劃分最大/最小值,循環獲得文件上的劃分。注意,劃分不會跨越文件。
FileInputFormat沒有實現InputFormat的createRecordReader方法。
FileInputFormat有兩個子類,SequenceFileInputFormat是Hadoop定義的一種二進制形式存放的鍵/值文件(參考http://hadoop.apache.org/core/do ... o/SequenceFile.html),它有本身定義的文件佈局。因爲它有特殊的擴展名,因此SequenceFileInputFormat重載了listStatus,同時,它實現了createRecordReader,返回一個SequenceFileRecordReader對象。TextInputFormat處理的是文本文件,createRecordReader返回的是LineRecordReader的實例。這兩個類都沒有重載FileInputFormat的getSplits方法,那麼,在他們對於的RecordReader中,必須考慮FileInputFormat對輸入的劃分方式。
FileInputFormat的getSplits,返回的是FileSplit。這是一個很簡單的類,包含的屬性(文件名,起始偏移量,劃分的長度和可能的目標機器)已經足以說明這個類的功能。
RecordReader用於在劃分中讀取<Key,Value>對。RecordReader有五個虛方法,分別是:
l initialize:初始化,輸入參數包括該Reader工做的數據劃分InputSplit和Job的上下文context;
l nextKey:獲得輸入的下一個Key,若是數據劃分已經沒有新的記錄,返回空;
l nextValue:獲得Key對應的Value,必須在調用nextKey後調用;
l getProgress:獲得如今的進度;
l close,來自java.io的Closeable接口,用於清理RecordReader。
咱們以LineRecordReader爲例,來分析RecordReader的構成。前面咱們已經分析過FileInputFormat對文件的劃分了,劃分完的Split包括了文件名,起始偏移量,劃分的長度。因爲文件是文本文件,LineRecordReader的初始化方法initialize會建立一個基於行的讀取對象LineReader(定義在org.apache.hadoop.util中,咱們就不分析啦),而後跳過輸入的最開始的部分(只在Split的起始偏移量不爲0的狀況下進行,這時最開始的部分多是上一個Split的最後一行的一部分)。nextKey的處理很簡單,它使用當前的偏移量做爲Key,nextValue固然就是偏移量開始的那一行了(若是行很長,可能出現截斷)。進度getProgress和close都很簡單。
更多精彩內容請關注:http://bbs.superwu.cn
關注超人學院微信二維碼: