1. 程式人生 > >MapReduce優化——配置調優

MapReduce優化——配置調優

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。

可以通過以下方法提高排序和快取寫入磁碟的效率:

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

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

  1. 壓縮輸出,以節省儲存空間,同時也提升HDFS寫入吞吐量
  2. 避免寫入帶外端檔案(out-of-band side file)作為Reduce任務的輸出
  3. 根據作業輸出檔案的消費者的需求,可以分割的壓縮技術或許適合
  4. 以較大塊容量設定,寫入較大的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的中間資料都儲存在記憶體中勝利的。
這裡寫圖片描述
這裡寫圖片描述