一. 介紹
- 很多業務邏輯很簡單,主要難點是資料量太大,可使用分散式處理提高速度。
- 傳統分散式程式,計算邏輯和分散式任務分發、故障恢復混在一起,原本簡單的計算邏輯變得模糊不清,難以處理。
- MapReduce將兩者分離,任務分發,容錯,恢復等邏輯由模型完成,程式設計師只需要專注計算邏輯。大大了簡化程式碼架構,減輕開發人員工作難度。
二. 模型概述
- Map/Reduce函式由使用者編寫
- Map函式負責處理輸入的k/v對,生成中間態k/v對
- 之後傳送出去,按照Key值進行分組,不同Key值的資料傳送到不同的Reduce中
- Reduce函式接收中間態的值並進行聚合,最終輸出自己負責的Key值的結果
示例
// key: document name
// value: document contents
map(String key, String value):
for each word w in value:
EmitIntermediate(word,"1");
// key: a word
// values: a list of counts
reduce(String key, Iterator values):
int result = 0;
for each v in values:
result += ParseInt(v);
Emit(AsString(result));
- map函式對一行字串進行分解,生成(word,1)的KV對
- reduce函式累加每一個單詞的出現計數,等到所有資料處理完畢,就可以得到結果
三. 實現
將輸入的陣列分割為M份
透過一個分割槽函式將中間態的值劃分為R組(例如: hash(key) mod R
)
1 執行概述
- 將輸入檔案拆分為M份,通常每份大小為16MB至64MB(可配置)
- 在叢集中的一組機器上啟動多個程式的副本,只有一個
master
。剩下的都是worker
,worker
由master
分配任務 - 現有M個
map
任務和R個reduce
任務。master
選擇空閒的worker
,分配map
或reduce
任務 map worker
從輸入資料中解析K/V
對,並將kv對傳遞給使用者自定義的map函式。從而產生中間態K/V
對,然後快取在記憶體中。- 快取中的
K\V
對會被週期性地寫入本地磁碟,透過分割槽函式將其劃分到R個區域中。這些快取所在的磁碟的位置會被髮送給master,master將這些位置資訊轉發給reduce worker。 reduce worker
獲得位置資訊後,會透過RPC從map worker
的本地磁碟讀取緩衝資料。當reduce worker
讀完所有的中間資料後,它會根據key值進行排序,從而將key值相同的陣列放在同一組。排序是必需的,因為通常會有很多不同的key對映到同一個reduce任務。如果中間資料量太大,無法放入記憶體中,則可使用外部排序。reduce worker
遍歷已排序的中間資料,對於每個Key,它將該Key和與之對應的中間值集合傳遞給使用者的reduce函式。Reduce函式產生結果,寫入到這個Reduce的結果輸出檔案中。- 當所有map和reduce任務都完成後,
master
喚醒使用者程式。此時,使用者程式中對MapReduce
呼叫,就會獲得結果。
成功完成後,結果會被存放在R個輸出檔案中(每個reduce任務對應一個輸出檔案,檔名由使用者指定)。通常不需要將這R個輸出檔案合併為一個檔案 — 通常這些檔案會作為輸入傳遞給下一階段的MapReduce。
2.Master的資料結構
Master中維護一些資訊:
- 每個任務的狀態
- 所有worker機器的標識
- map生成的R箇中間態檔案所在的位置和大小
master會將map生成的中間態檔案位置和大小資訊以增量的方式持續推送給執行中的reduce Worker。
3. 容錯
Worker Failure
Master 週期性ping worker,一段時間沒有響應:
-
標記此worker失敗,該worker負責的任務都會被重置為初始狀態,排程去其他worker重新執行
-
已完成的map任務在故障後需重新執行,因為map的輸出儲存在故障機器的本地磁碟,無法訪問。而已完成的reduce任務不需要重複執行,因為它們的輸出儲存在全域性檔案系統中
-
通知reduce任務,A斷線了,之後從B讀取資料
Master Failure
- 重啟
4. Locality
網路傳輸耗時,減少網路傳輸,優先將map任務分配到距離輸入資料主機物理距離較近的地方。
5. Task Granularity(任務粒度)
- M和R的值都應遠大於worker機器的數量
6.Backup Tasks(備份執行)
解決掉隊者問題,一臺機器花費了異常長的時間去完成最後的幾個map或reduce任務
當MapReduce只剩最後幾個任務時,排程剩餘任務到多個節點同時執行,最後無論是主節點還是備份節點執行完成,任務都將被視為完成
四.每個元件的任務
1.Master
1.1 執行需要的引數
- 要處理的任務型別
- 待處理的檔案列表
1.2 分發任務
分發任務給可處理對應任務的worker, 記錄發給worker對應的檔名
監聽
監聽worker狀態,如果2S沒完成,就標記為Dead,重新分發這個檔案到其他空閒worker
執行完成
執行完成後,worker將訊息傳回Master,Master進行接收,然後按Key進行分發,如果是舊Key就發給對應的Reduce worker,反之就採用輪詢,將對應任務發給下一個Reduce worker
心跳
worker每10S和Master進行心跳連線
2. Worker
2.1 啟動時引數
- Master地址
2.2 心跳
每10S和Master進行一次心跳
2.3 接收Master任務
-
任務型別
-
要處理的檔名
-
輸出結果