1. 程式人生 > >MapReduce過程詳解及其效能優化

MapReduce過程詳解及其效能優化

 1、這裡的merge和map端的merge動作類似,只是陣列中存放的是不同map端copy來的數值。Copy過來的資料會先放入記憶體緩衝區中,然後當使用記憶體達到一定量的時候才spill磁碟。這裡的緩衝區大小要比map端的更為靈活,它基於JVM的heap size設定。這個記憶體大小的控制就不像map一樣可以通過io.sort.mb來設定了,而是通過另外一個引數mapreduce.reduce.shuffle.input.buffer.percentdefault 0.7f 原始碼裡面寫死了) 來設定,這個引數其實是一個百分比,意思是說,shuffile在reduce記憶體中的資料最多使用記憶體量為:0.7 × maxHeap of reduce task。JVM的heapsize的70%。記憶體到磁碟merge的啟動門限可以通過mapreduce.reduce.shuffle.merge.percent
(default0.66)配置。也就是說,如果該reduce task的最大heap使用量(通常通過mapreduce.admin.reduce.child.java.opts來設定,比如設定為-Xmx1024m)的一定比例用來快取資料。預設情況下,reduce會使用其heapsize的70%來在記憶體中快取資料。假設 mapreduce.reduce.shuffle.input.buffer.percent 為0.7,reducetask的max heapsize為1G,那麼用來做下載資料快取的記憶體就為大概700MB左右。這700M的記憶體,跟map端一樣,也不是要等到全部寫滿才會往磁碟刷的,而是當這700M中被使用到了一定的限度(通常是一個百分比),就會開始往磁碟刷(刷磁碟前會先做sortMerge)。這個限度閾值也是可以通過引數 mapreduce.reduce.shuffle.merge.percent
(default0.66)來設定。與map 端類似,這也是溢寫的過程,這個過程中如果你設定有Combiner,也是會啟用的,然後在磁碟中生成了眾多的溢寫檔案。這種merge方式一直在執行,直到沒有map端的資料時才結束,然後啟動磁碟到磁碟的merge方式生成最終的那個檔案。