MapReduce論文讀後感
架構

思考一二三
- MapReduce的思想源自函數語言程式設計(lisp類語言)中的Map和Reduce函式,MapReduce將該思想應用在了分散式環境中,將任務由單機程序變為了分散式系統環境下的Task,並解決任務排程、中間結果傳輸、錯誤處理等關鍵問題;
- Mapper數量M和Reducer數量R之間有沒有什麼關係?M >> R ? M ~ R?R的數量不能太多,因為M產生的中間結果會被儲存為本地臨時檔案,且這些臨時檔案根據hash(key) % R被分別儲存在R個檔案中,如果R過多會造成本地檔案系統下的臨時檔案數量較多,影響效能;
- 每個Worker既可以執行Map任務也可以執行Reduce任務嗎?應該是的,保證資源的高效利用。Map和Reduce任務作為一個個的Task被排程至Worker上,Hadoop的MapReduce框架實現了排程演算法YARN。
- Reducer和Mapper可以並行處理?應該可以,兩者之間其實沒什麼耦合,只要資料準備好了,就可以執行。Map任務完成後,Worker即可向Master節點彙報完成狀態以及其產生的臨時檔案位置,Master即可通知Reduce Task。
- Mapper可以級聯嗎?Reducer可以級聯嗎?應該可以,甚至在很多時候是必要的,這也是該模型的強大之處:提供了一個足夠簡單的框架,但是可以高度擴充套件
- 資料來源以及最終結果都會儲存在磁碟上(GFS),但Map階段產生的中間結果儲存在Map任務處理本地。每個階段的互動通過RPC請求經由網路傳輸,瓶頸在於網路傳輸
- Mapper之間、Mapper-Reducer之間、Reducer之間沒有任何通訊,非常的鬆耦合,由Master角色負責統一排程,保持了架構清晰和較強的可擴充套件性;Master節點儲存的狀態資料較少,壓力不大。根據論文描述,,單Master叢集可擴充套件至數千Worker節點;
- Map階段產生的中間結果存在本地磁碟上(為什麼不直接使用GFS儲存?效率的原因?同時也減少網路等資源消耗)
- 批處理而非流式處理:無法做到資料邊產生邊處理。Mapper產生的中間結果資料只能全部寫入臨時檔案後才能通知Reducer進行下一階段處理,實時性較差
- 關鍵是思考隱藏在MapReduce背後的哲學思想
容錯
Worker失效
MapReduce的Master節點會週期地向每一個Worker 傳送 Ping訊號(為什麼不設計成Worker彙報機制?)。如果某個Worker一段時間內沒有響應,Master 就會認為Worker已經不可用。
對於失效Worker,任何分配給該 Worker 的 Map 任務,無論是正在執行還是已經完成,都需要由 Master 重新分配給其他 Worker,因為該 Worker 不可用也意味著儲存在該 Worker 本地磁碟上的中間結果亦無法訪問。同時,Master 也會將這次重試通知給所有 Reducer,Reducer 會開始從新的 Mapper 上獲取資料。
同時,Master 則會將Worker上未完成的Reduce任務分配給其他 Worker。鑑於 Google MapReduce 的結果是儲存在 Google File System 上的,GFS保證了已完成任務的資料的可用性。
Master 失效
整個 MapReduce 叢集中只有一個 Master 節點,MapReduce 使用Chubby來提高服務的可用性。
Master在執行時會週期性地將叢集的當前狀態作為儲存點(Checkpoint)寫入到磁碟(GFS?)中。Master 退出後,重新啟動的 Master 程序即可利用儲存在磁碟中的資料恢復到上一次儲存點的狀態。
Worker落後
如果某個 Worker 花了特別長的時間來完成最後的幾個 Map 或 Reduce 任務,整個 MapReduce 計算任務的耗時就會因此被拉長,這樣的 Worker 稱為落後者(Straggler)。
MapReduce 在整個計算完成到一定程度時(何時?)就會將剩餘的任務進行冗餘:即同時將其分配給其他空閒 Worker 來執行,並在其中一個 Worker 完成後將該任務視作已完成。
優化
資料本地性
在 Google 內部所使用的計算環境中,機器間的網路頻寬是稀缺的資源,設計時需要儘量減少在機器間過多地進行不必要的資料傳輸。
Google MapReduce 使用 Google File System 來儲存輸入源和輸出結果。作為優化,Master 在分配 Map 任務時會感知 Google File System 中各個 Block 的位置資訊,並儘量將對應的 Map 任務分配到持有或者接近該 Block資料的機器上。
Combiner
在某些情形下,使用者定義的 Map 任務可能會產生大量重複的中間結果。Google MapReduce 允許使用者在Map上的Combiner函式:Mapper會對中間結果自動執行Combiner進行區域性合併,減少產生的臨時資料量,以計算換儲存。