InputFormat主要用於對輸入數據的描述。提供了兩個功能。
1,數據的切片。InputFormat按照某個策略,將輸入數據切分為若干個split,Map任務的個數和split的個數相對應。
Inputformat中對應getSplits的方法,完成數據切分的功能。歸於inputsplit有兩個特點。
A,邏輯分片。Inputsplit只是在邏輯上對輸入的數據進行分片,並不會在磁盤上將其切分,inputspli只是記錄了分片的元數據信息,比如說起始位置,長度和節點的列表等。
B,可序列化。Inputsplit序列化以方便進程間通信。作業提交的時候,inputsplit會序列化到文件中,在map任務啟動前,初始化的時候可以直接讀取文件。
inputformat的FileInputFormat中inputsplit的切分過程。
FileInputFormat的切分主要包括兩個方面,一是文件的切分。二是host的選擇。
文件的切分,主要是要確認每一個切片的大小splitSize,切片的數量為文件的大小/splitSize。hadoop中切片的大小是如下確認的:
splitSize=max{minSize,min{maxSize,BlockSize}};
其中minSize和maxSize可以進行配置,BlockSize是hdfs中每個block的大小。
host選擇算法直接印象運行過程中任務的本地性。hadoop對本地性划分為3個等級,node,rack,datacenter。host在選擇的時候是選擇包含該inputsplit數據總量最大的前幾個節點
2,位Mapper提供輸入數據。通過某個給定的split,能夠將其解析成一個個的key/value對。inputformat中另外一個方法是getRecordReader;通過傳入inputsplit,返回recordReader對象。Map任務執行過程中,就是通過不斷的調用RecordReader的方法迭代獲取key/value.
順便說一下outputformat。
outputformat中主要包括兩個方法1,getRecoreWrite。2,checkOutputSpecs。
checkOutputSpecs主要檢查輸出目錄是否合法,一般在作業提交之前會被調用,如果目錄已經存在就會拋出異常,放置文件被覆蓋。
fileOutPutFormat的實現中為了放置推測式的任務產生沖突,會為每個task任務數據創建side-effect,將產生的數據臨時寫入該文件,等task完成后在移動到最終輸出任務。