MapReduce優化(總(總體怎麼調優),分(map怎麼調優,ruduce怎麼調優))

1、配置調優

調優總的原則給shuffle過程儘量多提供內存空間,在map端,可以通過避免多次溢出寫磁盤來獲得最佳性能(相關配置io.sort.*,io.sort.mb),在reduce端,中間數據全部駐留在內存時,就能獲得最佳性能,但是默認情況下,這是不可能發生的,因爲一般情況所有內存都預留給reduce含函數(如需修改 需要配置mapred.inmem.merge.threshold,mapred.job.reduce.input.buffer.percent)

如果能夠根據情況對shuffle過程進行調優,對於提供MapReduce性能很有幫助。
一個通用的原則是給shuffle過程分配儘可能大的內存,當然你需要確保map和reduce有足夠的內存來運行業務邏輯。因此在實現Mapper和Reducer時,應該儘量減少內存的使用,例如避免在Map中不斷地疊加。
運行map和reduce任務的JVM,內存通過mapred.child.java.opts屬性來設置,儘可能設大內存。容器的內存大小通過mapreduce.map.memory.mb和mapreduce.reduce.memory.mb來設置,默認都是1024M。
可以通過以下方法提高排序和緩存寫入磁盤的效率:

調整mapreduce.task.io.sort.mb大小,從而避免或減少緩存溢出的數量。當調整這個參數時,最好同時檢測Map任務的JVM的堆大小,並必要的時候增加堆空間。
mapreduce.task.io.sort.factor屬性的值提高100倍左右,這可以使合併處理更快,並減少磁盤的訪問。
爲K-V提供一個更高效的自定義序列化工具,序列化後的數據佔用空間越少,緩存使用率就越高。
提供更高效的Combiner(合併器),使Map任務的輸出結果聚合效率更高。
提供更高效的鍵比較器和值的分組比較器。

輸出依賴於作業中Reduce任務的數量,下面是一些優化建議:

壓縮輸出,以節省存儲空間,同時也提升HDFS寫入吞吐量
避免寫入帶外端文件(out-of-band side file)作爲Reduce任務的輸出
根據作業輸出文件的消費者的需求,可以分割的壓縮技術或許適合
以較大塊容量設置,寫入較大的HDFS文件,有助於減少Map任務數

2、Map/Reduce端調優

通用優化
Hadoop默認使用4KB作爲緩衝,這個算是很小的,可以通過io.file.buffer.size來調高緩衝池大小。

map端優化
避免寫入多個spill文件可能達到最好的性能,一個spill文件是最好的。通過估計map的輸出大小,設置合理的mapreduce.task.io.sort.*屬性,使得spill文件數量最小。例如儘可能調大mapreduce.task.io.sort.mb。

在這裏插入圖片描述
reduce端優化
如果能夠讓所有數據都保存在內存中,可以達到最佳的性能。通常情況下,內存都保留給reduce函數,但是如果reduce函數對內存需求不是很高,將mapreduce.reduce.merge.inmem.threshold(觸發合併的map輸出文件數)設爲0,mapreduce.reduce.input.buffer.percent(用於保存map輸出文件的堆內存比例)設爲1.0,可以達到很好的性能提升。在TB級別數據排序性能測試中,Hadoop就是通過將reduce的中間數據都保存在內存中勝利的。

在這裏插入圖片描述
在這裏插入圖片描述

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