1. 程式人生 > >MapReduce學習筆記之Reduce任務(四)

MapReduce學習筆記之Reduce任務(四)

1. Reduce任務

Reduce任務是一個數據聚合的步驟。數量預設為1,而使用過多的Reduce任務則意味著複雜的shuffle,並使輸出檔案的數量激增。mapreduce.job.reduces屬性設定reduce數量,也可以通過程式設計的方式,呼叫Job物件的setNumReduceTasks()方法來設定。一個節點Reduce任務數量上限由mapreduce.tasktracker.reduce.tasks.maximum設定(預設2)。

可以採用以下探試法來決定Reduce任務的合理數量:

# 每個reducer都可以在Map任務完成後立即執行
0.95 * (節點數量 * mapreduce.tasktracker
.reduce.tasks.maximum)

另一個方法是

# 較快的節點在完成第一個Reduce任務後,馬上執行第二個
1.75 * (節點數量 * mapreduce.tasktracker.reduce.tasks.maximum)

2. 獲取中間輸出結果(Reduce側)

Reduce任務在結束時都會獲取Map任務相應的分割槽資料,這個過程叫複製階段(copy phase)。一個Reduce任務並行多少個Map任務是由mapreduce.reduce.shuffle.parallelcopies引數決定(預設5)。

由於網路問題,Reduce任務無法獲取資料時,會以指數退讓(exponential backoff)的方式重試,超時時間由mapreduce.reduce.shuffle.connect.timeout設定(預設180000,單位毫秒),超時之後,Reduce任務標記為失敗狀態。

3. 中間輸出結果的合併與溢位

這裡寫圖片描述

Reduce任務也需要對多個Map任務的輸出結果進行合併,過程如上圖,根據Map任務的輸出資料的大小,可能將其複製到記憶體或磁碟。mapreduce.reduce.shuffle.input.buffer.percent屬性配置了這個任務佔用的快取空間在堆疊空間中的佔用比例(預設0.70)。

mapreduce.reduce.shuffle.merge.percent決定快取溢位到磁碟的閾值(預設0.66),mapreduce.reduce.merge.inmem.threshold設定了Map任務在快取溢位前能夠保留在記憶體中的輸出個數的閾值(預設1000),只要一個滿足,輸出資料都將會寫到磁碟。

在收到Map任務輸出資料後,Reduce任務進入合併(merge)或排序(sort)階段。同時合併的檔案流的數量由mapreduce.task.io.sort.factor屬性決定(預設10)。

Map任務輸出資料的所有壓縮操作,在合併時都會在記憶體中進行解壓縮操作。

4. 參考

《精通Hadoop》 [印] Sandeep Karanth著 劉淼等譯