MapReduce論文閱讀記錄

本文爲閱讀MapReduce論文的記錄,內容主要是論文的第三部分——實現。方便本人今後查看。

1. 運行概述

下圖展示了 MapReduce 過程的整體情況

這裏寫圖片描述

當用戶程序執行 MapReduce 時,會依次發生以下動作(對應圖中的標號):

  1. 用戶程序中的 MapReduce 庫將輸入文件分成 M 個分片,每片有16M-64M(由用戶決定),MapReduce 庫還會將程序拷貝到集羣機器上。

  2. 集羣中有一個 master,多個 worker。在拷貝程序過程中,其中 master 獲得的程序是特殊的。master 將分配工作給 worker。現在有 M 個 map 任務和 R 個 reduce 任務需要被分配。master 會選擇空閒的 worker,分配給 map 任務或 reduce 任務。一個 worker 只能擔任一個 map 任務或 一個reduce 任務。

  3. 被分配 map 任務的 worker 接下來會讀取相應的輸入塊,將輸入數據解析成 k-v 對,並將 k-v 對傳給用戶定義的 Map 函數。由 Map 函數生成的中間結果 k-v 對緩存在內存中。

  4. 緩存的中間結果將定期地被寫到本地磁盤上。分區函數(例如,hash(key) mod R)將中間結果分割成 R 個分區。然後,中間結果在本地磁盤的位置將傳回給 master,接着 master 將負責把這些位置傳給reduce worker。

  5. 當 reduce worker 被 master 通知了中間結果的位置,它將通過 RPC 讀取 map worker 本地磁盤上的中間結果。當完成讀取工作,它會對中間結果進行排序,讓具有相同 key 的對被分組在一塊。

    排序工作的重要性在於:通常具有不同 key 的對會被分到同一個 reduce 任務中(與分區函數有關)。如果由於中間結果過大,無法裝進內存進行排序,需要使用外部排序。

  6. reduce worker 對已排序的數據進行遍歷,每遇到一個不同的 key,便將 key 與對應的一系列 value 傳給用戶定義的 reduce 函數。其輸出將作爲該 reduce 分區的結果,追加到最終的輸出文件中。

  7. 當所有的 map 、reduce 任務完成, master 將喚醒用戶程序。同時,用戶程序中的mapreduce 調用得到返回。

在執行完成後,mapreduce 的輸出將是 R 個文件(每個 reduce 任務一個)。通常,用戶不需要將這 R 個文件合併成一個,可作爲輸入傳給另一個 mapreduce 調用,或另一個分佈式程序。


2. Master 數據結構

對於每個 map、reduce 任務,master 都會存儲其狀態(idle、in-progress、completed)和 non-idle的 worker 的信息。

master 在 map 任務到 reduce 任務之間傳輸中間結果的位置。對於每個完成的 map 任務,master 會存儲其 R 個分區的位置和大小,並將該信息逐漸傳輸給處於 in-progress的reduce worker。


3. 容錯

3.1 worker 故障

master 定期地 ping 所有 worker。如果一個 worker 長時間沒有響應, master 認爲該 worker 已故障。該worker 上,以下任務,將被重置爲 idle 狀態,並將該任務重新分配到其他 worker 上

  • 處於 completed 狀態的 map 任務
  • 處於 in-progress 狀態的 map、reduce 任務
  • 處於 in-progress 狀態的 reduce 任務

completed 狀態的 map 任務需要重新執行的原因:輸出存儲在故障機器的本地磁盤上,已經不可訪問了。

completed 狀態的 reduce 任務不需要重新執行的原因:輸出存儲在全局文件系統(GFS)上。

worker A 執行 map 任務,由於 A 故障了,接着由 worker B 執行該 map 任務。所有在運行 reduce 任務的 worker 都將被通知重新執行,而還沒有從 worker A 讀數據的 reduce 任務,將轉爲 worker B。

3.2 master 故障

master 定期檢查點記錄狀態,當 master 任務死亡時,從最近的檢查點狀態開始執行。

3.3 本地性

網絡帶寬是我們的計算環境中相對稀缺的資源。 我們通過利用輸入數據(由 GFS 管理)存儲在組成我們集羣的機器的本地磁盤上的來節省網絡帶寬。 GFS 將每個文件分成 64MB 塊,並在不同的機器上存儲每個塊的多個副本(通常是3個副本)。 mapReduce master 將輸入文件的位置信息考慮在內,並嘗試在包含相應輸入數據副本的機器上分配 map 任務。否則,它將嘗試在該任務的輸入數據副本附近(例如,在與包含數據的計算機處於同一網絡交換機上的機器上)安排一個 map 任務。 在集羣中大部分 worker 上運行大型MapReduce操作時,大多數輸入數據都是本地讀取的,不會消耗網絡帶寬。

3.4 任務粒度

從上文我們可以得知,map 階段被劃分成 M 個 task,reduce 階段被劃分成 R 個 task,MR 一般會比集羣中節點數大得多。每個節點運行多個 task 有利於動態的負載均衡,加速 worker 從失敗中恢復。

在具體的實現中,MR 的大小是有實際限制的,因爲 master 至少要做 O(MR) 次的調度決策,並且需要保持O(M * R)個狀態(使用的內存並不大,一條 M-R 記錄需要 1 字節)。

通常情況下,R 的大小是由用戶指定的,而對 M 的選擇要保證每個任務的輸入數據大小,即一個輸入分片在 16MB~64MB 之間(數據本地性最優)。R 的大小是 worker 數量的一個較小的倍數。

3.5 備份任務

一種最常見的延長 mapreduce 運行總時間的原因是 “straggler”:一臺機器花費異常時間完成最後一個 map 或 reduce 任務。“straggler” 出現的原因有很多,例如:磁盤有問題,讀取速度下降;集羣調度在機器上安排了其他任務,由於競爭CPU、內存、本地磁盤或網絡帶寬,導致其更慢地執行 mapreduce 代碼。

解決“straggler”的機制:當 mapreduce 操作快完成時, master 會備份剩餘的 in-progress 狀態的任務。無論主程序或備份程序執行完成,該任務都會被標記爲已完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章