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)
reduce任務在結束時都會獲取map任務相應的分割槽資料,這個過程叫複製階段(copy phase)。乙個reduce任務並行多少個map任務是由mapreduce.reduce.shuffle.parallelcopies引數決定(預設5)。
由於網路問題,reduce任務無法獲取資料時,會以指數退讓(exponential backoff)的方式重試,超時時間由mapreduce.reduce.shuffle.connect.timeout設定(預設180000,單位毫秒),超時之後,reduce任務標記為失敗狀態。
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任務輸出資料的所有壓縮操作,在合併時都會在記憶體中進行解壓縮操作。
《精通hadoop》 [印] sandeep karanth著 劉淼等譯
MapReduce學習筆記
mapreduce是一種程式設計模式,用於大規模資料的並行運算。map reduce 是它們的主要思想。使用者用map 對映 函式把一組鍵值對對映成另一組鍵值對,指定併發的reduce 歸納 函式,來保證所有對映的鍵值對中的每乙個共享共同的鍵組。工作原理 如上圖 右圖是 裡給出的流程圖。一切都是從最...
Mapreduce學習筆記(二)
今天來談一談,shuffle過程,shuffle中文翻譯是洗牌,是在map 和reduce之間的一套可編寫程式,就像可插拔的元件一樣,我們可以編寫一些程式來替換它們,以達到我們的需求目的。以下是詳細的shuffle過程。partition 是實現對檔案的分類輸出,如下圖,實現按年份不同將結果輸出到不...
MapReduce學習筆記 2
同樣,hadoop預定義了一些非常有用的reducer類 預設的做法是對key進行雜湊來確定reducer,hadoop通過hashpartitioner類強制執行這個策略。但是有時我們想通過key值中的某個屬性進行排序,而不是key的整體,使用hashpartitioner就會出錯。所以我們需要自...