MapReduce之片和塊的關係
阿新 • • 發佈:2020-07-17
@目錄
片大小的計算
long splitSize = computeSplitSize(blockSize, minSize, maxSize);
protected long computeSplitSize(long blockSize, long minSize, long maxSize) {
return Math.max(minSize, Math.min(maxSize, blockSize));
}
blockSize
: 塊大小
minSize
: minSize從mapreduce.input.fileinputformat.split.minsize
maxSize
: 讀取mapreduce.input.fileinputformat.split.maxsize
,如果沒有設定,則使用Long.MaxValue
作為預設值
預設的片大小就是檔案的塊大小
檔案的塊大小預設為128M,預設每片就是128M!
- 調節片大小 > 塊大小:配置
mapreduce.input.fileinputformat.split.minsize
> 128M - 調節片大小 < 塊大小:配置
mapreduce.input.fileinputformat.split.maxsize
< 128M
理論上來說:如果檔案的資料量是一定的話,
- 片越大,切片數量少,啟動的MapTask少,Map階段運算慢!
- 片越小,切片數量多,啟動的MapTask多,Map階段運算快!
片和塊的關係
片(InputSplit)
:
- 在計算MR程式時,才會切片。片在執行程式時,臨時將檔案從邏輯上劃分為若干部分
- 使用的輸入格式不同,切片的方式不同,切片的數量也不同
- 每片的資料最終也是以塊的形式儲存在HDFS
塊(Block)
:
在向HDFS寫檔案時,檔案中的內容以塊為單位儲存!塊是實際的物理存在!
建議: 片大小最好等於塊大小!
因為將片大小設定和塊大小一致,可以最大限度減少因為切片帶來的磁碟IO和網路IO