1. 程式人生 > >MapReduce 程式設計 系列十二 Reduce階段內部細節和調節引數

MapReduce 程式設計 系列十二 Reduce階段內部細節和調節引數

Reduce計算分為若干階段

1. copy(或者叫shuffle)階段和merge階段並行

之前Map產生的結果被存放在本地磁碟上,這時需要從reduce節點將資料從map節點複製過來。放得下進記憶體,比較大的則寫到本地磁碟。

同時,有兩個執行緒對已經獲得的記憶體中和磁碟上的資料進行merge操作。

具體細節是:

通過RPC呼叫詢問task tracker已經完成的map task列表,shuffle(洗牌)是對所有的task tracker host的洗牌操作,這樣可以打亂copy資料的順序,防止出現網路熱點(大量程序讀取一個task tracker節點的資料)。

可以複製的任務被存放在scheduledCopies中。

一旦有了要複製到資料,會啟動多個MapOutputCopier執行緒,通過HTTP GET請求複製資料,如果資料較大,存入磁碟,否則存入快取。

對於快取中,有執行緒InMemoryFSMerge執行緒負責merge,對檔案,有LocalFSMerger執行緒負責merge。

因此觀察jobtracker會看到map操作還沒有完全結束,reduce操作已經開始了,就是進入了copy階段。

2. sort階段和呼叫reducer的reduce函式的並行

sort對Map階段傳來的<key,value> 資料針對key執行歸併排序,產生<key, values>

使用者編寫的reduce將上面的<key, values>傳遞進ruduce函式處理

並行的演算法提高了程式效能,具體演算法以後再探討。

3. write

將結果寫到HDFS上。

Reduce的調優引數

mapred.reduce.parallel.copies 預設是5,表示有多少個併發執行緒去從task tracker節點複製資料

io.sort.factor 又出現了,預設10,仍然指的是並行合併檔案的數目

mapred.job.shuffle.merge.percent 預設是0.66, 超過66%,就會將開始合併,然後往磁碟上寫資料

mapred.inmem.merge.threshold 預設是1000,超過這個臨界值,就會將開始合併,然後往磁碟上寫資料