前言: Mapreduce程式的效率的瓶頸在於兩點: MapReduce優化方法 數據輸入: (1)合併小文件:在執行任務前將小文件進行合併 (2)採用CombineTextInputformat來作為輸入,解決輸入端大量小文件的場景。將多個小文件從邏輯上規划到一個切片中,這樣,多個小文件就可以交給 ...
前言:
Mapreduce程式的效率的瓶頸在於兩點:
電腦性能: CPU、記憶體、磁碟健康、網路 I/O操作:
數據傾斜
map和reduce數量設置不合理
map的運行時間太長,導致reduc的等待過久
小文件過多
大量的補課分塊的超大文件
spill(溢寫)次數過多
merge(合併)次數過多
MapReduce優化方法
數據輸入:
(1)合併小文件:在執行任務前將小文件進行合併
(2)採用CombineTextInputformat來作為輸入,解決輸入端大量小文件的場景。將多個小文件從邏輯上規划到一個切片中,這樣,多個小文件就可以交給一個 maptask。
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
CombineTextInputFormat.setMinInputSplitSize(job, 2097152);// 2m
job.setInputFormatClass(CombineTextInputFormat.class)
Map階段:
(1)減少溢寫(spill)操作:通過調整 io.sort.mb 及 sort.spill.percent 參數值,增大觸發spill 的記憶體上限,減少 spill 次數,從而減少磁碟 IO。
(2)減少合併(merge)操作:通過調整 io.sort.factor 參數,增大 merge 的文件數目,減少 merge 的次數,從而縮短 mr 處理時間。
(3)在不影響業務邏輯的前提下,先進行combine處理,減少I/O。
Reduce階段:
(1)合理設置map和reduce的數量
(2)設置map、reduce共存:調整 slowstart.completedmaps 參數,使 map 運行到一定程度後,reduce 也開始運行,減少reduce 的等待時間。
(3)規避使用reduce
(4)合理使用reduce端的buffer
I/O傳輸:
(1)採用數據壓縮的方法,減少網路IO時間
(2)使用sequenceFile二進位文件
數據傾斜問題:
(1)抽樣和範圍分區
(2)自定義分區
(3)Combine
(4)採用Map join,儘量避免reduce join
JVM重用:
對於大量的小文件job,開啟JVM重用會減少45%運行時間。
具體設置:mapreduce.job.jvm.numtasks 值在 10-20 之間。