1. 程式人生 > 實用技巧 >MapReduce之片和塊的關係

MapReduce之片和塊的關係

@目錄

片大小的計算

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

和1之間對比,取最大值
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