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,超過這個臨界值,就會將開始合併,然後往磁碟上寫資料