1. 程式人生 > 程式設計 >mit6824-lab1 讀論文

mit6824-lab1 讀論文

MapReduce 論文公佈自 2003 MapReduce: Simplified Data Processingn。在這之前 google 每天已經有大量的資料需要處理。MapReduce 的誕生讓程式設計師在面對大資料量環境下只需要專注於實現業務邏輯,並在一定程度上遵循當時 MapReduce 架構下的規則即可。在當時, MapReduce 已經被用到:計算 URL 訪問頻率、 分散式 Grep、倒排索引和分散式排序等。

MapReduce 的核心思想是:首先將需要處理的大量資料分片,然後對分片之後的內容進行處理,輸出中間內容,這個過程稱為 Map。隨後再整合這些中間內容得到最終結果,這個過程稱為 Reduce。

這個過程,實現起來有很多種方式,需要考慮實際業務場景,硬體資源等。在 Google,通常是某個成百上千龐大的機器叢集組成。這些機器在同時且不斷地做著 Map 和 Reduce 的工作。

  1. 分片: 大量的資料首先會被分成小片,大小通常是 16M 到 64M。這個數值涉及到後面提到的資料本地化策略,資料本地化目的是為了節省頻寬。(畢竟 03 年的時候頻寬比現在差太多)

  2. MapReduce 任務分配: 由一個 master 程式來產生多個 worker 程式的副本跑在叢集中,這些 worker 程式通常分配 M 個 Map 任務,R 個 Reduce 任務。

  3. Map 階段: Map workers 會去讀入分片之後的資料,按照使用者自定義的函式處理,然後把產生的結構為 key-value 型別結果輸出到中間檔案中。

  4. Reduce 階段一:Master 獲取階段 3 的中間檔案的 index,傳給 Reduce worker。

  5. Reduce 階段二:Reduce worker 找到對應的中間檔案,然後按照 key 進行排序,排序的目的是讓相同 key 的檔案排在一起。這個過程我個理解為整合。同時,由於把大量的檔案在單獨的某個 worker 中做排序是非常耗費時間空間的,因此應該在這之前排好序,整合的時候只是一個 merge-sort 中的 merge 階段。比方說

# 輸入
[{k3,v1},{k1,v2},{k2 v1},v3},{k2,{k1: v1}]

# 排序
[{k1: v1},{k3,v1}]

# 相同 key 整合
[{k1: [v1,v2,v3]},[v1,v2]},[v1]}] 複製程式碼
  1. Reduce 階段三: 階段 5 之後就是整合之後的內容以 key-value 為單位傳給使用者自定義的函式。比如把 5 中的 [v1,v3] 進行求和之類的操作。

  2. 結束工作: 通常當所有的 Map worker 和 Reduce worker 都結束的時候,master 此時喚醒使用者程式(通常就是一個最開始的呼叫函式)。這個時候呼叫放就可以收到返回。

整個系統中 master 唯一,也就是說 master 如果掛了那麼外部就認為當前叢集不可用。worker 數目較多,可以接受一定數量的 worker 不可用。通常 master 會不斷 ping 這些 worker 同時儲存他們的狀態。當某個 worker 掛掉之後,master 就認為他的工作沒有做過,並轉交給別的 worker,這樣做的好處是每個 worker 的工作都是原子的。當 MapReduce 執行到後面的時候,通常是有大量的 Reduce 工作需要做。這個時候 master 又可以讓之前的 Map worker 轉為 Reduce worker。