MapReduce - 簡介



MapReduce 是一種程式設計模型,用於編寫可以在多個節點上並行處理大資料的應用程式。MapReduce 提供了分析海量複雜資料的能力。

什麼是大資料?

大資料是指無法使用傳統計算技術處理的大型資料集的集合。例如,Facebook 或 Youtube 每天需要收集和管理的資料量就屬於大資料範疇。然而,大資料不僅僅是規模和體積,它還涉及以下一個或多個方面:速度、多樣性、體積和複雜性。

為什麼要使用 MapReduce?

傳統的企業系統通常使用集中式伺服器來儲存和處理資料。下圖描述了傳統企業系統的示意圖。傳統模型顯然不適合處理海量可擴充套件的資料,並且無法由標準資料庫伺服器容納。此外,集中式系統在同時處理多個檔案時會造成嚴重的瓶頸。

Traditional Enterprise System View

Google 使用名為 MapReduce 的演算法解決了這個瓶頸問題。MapReduce 將任務劃分為小的部分,並將它們分配給許多計算機。之後,結果將收集到一個地方並整合以形成結果資料集。

Centralized System

MapReduce 如何工作?

MapReduce 演算法包含兩個重要的任務,即 Map 和 Reduce。

  • Map 任務接收一組資料並將其轉換為另一組資料,其中各個元素被分解成元組(鍵值對)。

  • Reduce 任務接收 Map 的輸出作為輸入,並將這些資料元組(鍵值對)組合成更小的元組集。

Reduce 任務總是在 Map 作業之後執行。

現在讓我們仔細看看每個階段,並嘗試理解它們的意義。

Phases
  • 輸入階段 - 在這裡,我們有一個 Record Reader,它轉換輸入檔案中的每個記錄,並將解析後的資料以鍵值對的形式傳送到 Mapper。

  • Map - Map 是一個使用者定義的函式,它接收一系列鍵值對,並處理每個鍵值對以生成零個或多個鍵值對。

  • 中間鍵 - Mapper 生成的鍵值對稱為中間鍵。

  • 組合器 - 組合器是一種本地 Reducer,它將 Map 階段中的相似資料分組到可識別的集合中。它接收來自 Mapper 的中間鍵作為輸入,並應用使用者定義的程式碼來在一個 Mapper 的小範圍內聚合值。它不是 MapReduce 演算法的主要部分;它是可選的。

  • 混洗和排序 - Reducer 任務從混洗和排序步驟開始。它將分組的鍵值對下載到本地機器上,Reducer 在該機器上執行。各個鍵值對按鍵排序成更大的資料列表。資料列表將等效的鍵分組在一起,以便可以輕鬆地在 Reducer 任務中迭代它們的值。

  • Reducer - Reducer 將分組的鍵值對資料作為輸入,並在每個鍵值對上執行 Reducer 函式。在這裡,資料可以以多種方式進行聚合、過濾和組合,並且需要廣泛的處理。執行完成後,它會向最後一步提供零個或多個鍵值對。

  • 輸出階段 - 在輸出階段,我們有一個輸出格式化程式,它轉換來自 Reducer 函式的最終鍵值對,並使用記錄寫入器將它們寫入檔案。

讓我們嘗試藉助一個小圖表來理解 Map 和 Reduce 這兩個任務:

MapReduce Work

MapReduce 示例

讓我們以一個現實世界的例子來理解 MapReduce 的強大功能。Twitter 每天接收大約 5 億條推文,大約每秒 3000 條推文。下圖顯示了 Tweeter 如何藉助 MapReduce 來管理其推文。

MapReduce Example

如下圖所示,MapReduce 演算法執行以下操作:

  • 標記化 - 將推文標記化為標記對映,並將它們寫為鍵值對。

  • 過濾 - 從標記對映中過濾不需要的詞,並將過濾後的對映寫為鍵值對。

  • 計數 - 為每個詞生成一個標記計數器。

  • 聚合計數器 - 將類似的計數器值聚合為小的易於管理的單元。

廣告