HIVE Map和Reduce數量 優化點

一、Map的數量是怎麼計算

代碼位置:org.apache.hadoop.hive.ql.io.(HiveInputFormat | CombineHiveInputFormat)
函數:getSplits
Hive的HiveInputFormat類 是對 MR的InputFormat接口 的封裝
下面介紹MR的Map數量獲取

1、計算 splitSize
// org.apache.hadoop.mapred.FileInputFormat getSplits函數

// totalSize 是Map端輸入的數據量, numSplits 是mapred.map.tasks參數值
long goalSize = totalSize / (numSplits == 0 ? 1 : numSplits);
// minSize: mapred.min.split.size
long minSize = Math.max(job.getLong(org.apache.hadoop.mapreduce.lib.input.
FileInputFormat.SPLIT_MINSIZE, 1), minSplitSize);
// blockSize,文件物理劃分成塊,大小配置在hadoop-default.xml,它的默認值是64MB
long splitSize = Math.max(minSize, Math.min(goalSize, blockSize));

總結: max( 文件最小切割值, min(Map端輸入量 / mapred.map.tasks, Hdfs Block Size) )

2、計算 Map數量:通過 splitSize 和 輸入文件的數量和大小

例如: Map輸入端有兩個文件,一個40M,一個20M。 splitSize是30M。
最終會切分成3個Map (40M的文件切分成30M、10M, 20M的文件不切分)

Map數量 優化點
>>> 在什麼情況下 應該增加Map數量
如果是CPU密集型任務、例如cube、rollup、UDF類,可以增加 mapred.map.tasks 數量 或者 增加mapred.min.split.size 

>>> 在什麼情況下 應該減少Map數量
一般是合併輸入的小文件
PS. Hive計算Map數量可以參考文章:hive小文件造成map多

二、Reduce的數量是怎麼計算

代碼位置:org.apache.hadoop.hive.ql.exec.mr.MapRedTask
函數:setNumberOfReducers、estimateNumberOfReducers

影響參數:

  • mapred.reduce.tasks (用戶直接設定reduce的數量)
  • hive.exec.reducers.bytes.per.reducer (每個reduce處理的數據量)
  • hive.exec.reducers.max (reduce的最多數量)
  • hive.exec.infer.bucket.sort.num.buckets.power.two (暫不考慮)

處理步驟:
1、mapred.reduce.tasks 是否設置,有的話reduce數量直接爲設置的數量
2、簡單說:Map 端的輸入數據量(totalInputFileSize)/ 每個reduce處理的數據量(hive.exec.reducers.bytes.per.reducer)

// 下面是具體代碼
// bytesPerReducer: hive.exec.reducers.bytes.per.reducer
// maxReducers: hive.exec.reducers.max
double bytes = Math.max(totalInputFileSize, bytesPerReducer);
int reducers = (int) Math.ceil(bytes / bytesPerReducer);
reducers = Math.max(1, reducers);
reducers = Math.min(maxReducers, reducers);
Reduce數量 優化點
>>> 在什麼情況下 應該增加Reduce數量
Map的輸出量比輸入量還大,比如有UDTF操作,單行變多行。
可以 hive.exec.reducers.bytes.per.reducer 參數值調低  或者 直接設置reduce數量。

>>> 在什麼情況下 應該減少Reduce數量
Map的輸出量相比輸入量少很多,有大量的數據被過濾或聚合。
可以 直接設置reduce數量 或者 限定reduce個數的最大值。
參考文章

https://blog.csdn.net/u010824946/article/details/81772631
https://blog.csdn.net/moon_yang_bj/article/details/17901371
https://www.iteblog.com/archives/1697.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章