1. 程式人生 > >InputFormat抽象類源碼分析

InputFormat抽象類源碼分析

cat apache pan lse 情況 rdd ini spl thread

InputFormat抽象類源碼解析
--------------------------
0.做兩件事:【進行邏輯切分InputSplit;創建RecordReader】
1.抽象方法:List<InputSplit> getSplits(JobContext context)
說明:邏輯地分割作業的輸入文件集-->InputSplit。然後將每個InputSplit分配給一個單獨的Map進行處理
2.抽象方法:RecordReader<K,V> createRecordReader(InputSplit split,TaskAttemptContext context)


說明:為給定的切分創建一個記錄讀取器。框架將調用RecordReader#initialize(InputSplit, tasktrytcontext)}使用分割。
3.默認加載的類為FileInputFormat(抽象類)
FileInputFormat
------------------------------------------
說明:基於文件的輸入格式的基類。FileInputFormat是所有基於文件的inputformat的基類。
FileInputFormat的子類還可以覆蓋isSplitable(JobContext, Path)方法,以確保輸入文件不被分割,並由map作為一個整體進行處理。

1.計算split:
getSplit()-->【獲取最小值:1】minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
-->【獲取最大值:Long.MAX_VALUE】maxSize = getMaxSplitSize(job);
-->【獲取文件信息和blockLocation】...
-->【獲取文件的block大小】blockSize = file.getBlockSize();

-->【計算splitsize切分大小】splitSize = computeSplitSize(blockSize, minSize, maxSize);
-->Math.max(minSize, Math.min(maxSize, blockSize));
說明:a.先將塊大小與默認最大值大小做比較,取小值;結果為128m
b.將上一步的計算結果與輸入文件的最小值比較,取大值,結果為128m;
總結:默認情況小,split切分大小與block大小相同;
-->【計算生成InputSplit(FileSplit),並添加至List中】

2.相關屬性:
【mapred-site.xml】:mapreduce.input.fileinputformat.split.minsize = 0
說明:默認設置文件輸入切分最小值為0
【FileInputFormat.class】:mapreduce.input.fileinputformat.split.maxsize = Long.MAX_VALUE
說明:默認設置文件輸入切分最大值為long最大值
【FileInputFormat.class】:mapreduce.input.fileinputformat.input.dir.recursive = false
說明:默認情況下不允許輸入路徑遞歸;可以調用FileInputFormat.setInputDirRecursive(job, true)
【mapred-site.xml】:mapreduce.input.fileinputformat.list-status.num-threads = 1
用於列出和獲取塊位置的線程數。對於指定的輸入路徑
3.默認將“_”和“.”開頭的文件過濾掉;


split切分規則,計算splitsize
----------------------------------------------------------
最小值 最大值 塊大小 切分大小
minSize maxSize blocksize splitsize
1. 1 Long.MAX_VALUE 128m 128m
【默認情形】
2. 1 Long.MAX_VALUE 256m 256m
【修改塊大小】
3. 1 64m 128m 64m
【修改mapreduce.input.fileinputformat.split.maxsize大小】
4. 130m Long.MAX_VALUE 128m 130m
【修改mapreduce.input.fileinputformat.split.minsize大小】


Recordreader源碼分析
-----------------------------------------
TextInputFormat做說明:
---------------------------------------
1.用於純文本文件的InputFormat子類。文件被分解成行;換行或回車都用來表示每行的結尾。鍵是文件中的偏移量和值是行的文本。
2.isSplitable()-->判定是否可被切分:純文本或bzip2壓縮格式可切分,其余方式均不可以。
3.createRecordReader(InputSplit split,TaskAttemptContext context)
-->new LineRecordReader(recordDelimiterBytes)
【LineRecordReader.class】:將鍵視為文件中的偏移量,將值視為行
-->屬性:mapreduce.input.linerecordreader.line.maxlength = Integer.MAX_VALUE
-->initialize()
-->SplitLineReader in 【構建org.apache.hadoop.util.LineReader】
org.apache.hadoop.util.LineReader.class
-->默認按“\r”,"\n","\r\n"進行處理


InputFormat抽象類源碼分析