MapReduce簡介和入門


MapReduce 是適合海量資料處理的程式設計模型。Hadoop是能夠執行在使用各種語言編寫的MapReduce程式: Java, Ruby, Python, and C++. MapReduce程式是平行性的,因此可使用多台機器叢集執行大規模的資料分析非常有用的。

MapReduce程式的工作分兩個階段進行:

  1. Map階段
  2. Reduce 階段

輸入到每一個階段均是鍵 - 值對。此外,每一個程式員需要指定兩個函式:map函式和reduce函式

整個過程要經歷三個階段執行,即

MapReduce如何工作

讓我們用一個例子來理解這一點 –

假設有以下的輸入資料到 MapReduce 程式,統計以下資料中的單詞數量:

Welcome to Hadoop Class

Hadoop is good

Hadoop is bad

MapReduce 任務的最終輸出是:

bad 

1

Class 

1

good 

1

Hadoop 

3

is 

2

to 

1

Welcome 

1

這些資料經過以下幾個階段

輸入拆分:

輸入到MapReduce工作被劃分成固定大小的塊叫做 input splits ,輸入折分是由單個對映消費輸入塊。

對映 - Mapping

這是在 map-reduce 程式執行的第一個階段。在這個階段中的每個分割的資料被傳遞給對映函式來產生輸出值。在我們的例子中,對映階段的任務是計算輸入分割出現每個單詞的數量(更多詳細資訊有關輸入分割在下面給出)並編製以某一形式列表<單詞,出現頻率>

重排

這個階段消耗對映階段的輸出。它的任務是合併對映階段輸出的相關記錄。在我們的例子,同樣的詞彙以及它們各自出現頻率。

Reducing

在這一階段,從重排階段輸出值彙總。這個階段結合來自重排階段值,並返回一個輸出值。總之,這一階段匯總了完整的資料集。

在我們的例子中,這個階段匯總來自重排階段的值,計算每個單詞出現次數的總和。

詳細的整個過程

  • 對映的任務是為每個分割建立在分割每條記錄執行對映的函式。
  • 有多個分割是好處的, 因為處理一個分割使用的時間相比整個輸入的處理的時間要少, 當分割比較小時,處理負載平衡是比較好的,因為我們正在並行地處理分割。
  • 然而,也不希望分割的規模太小。當分割太小,管理分割和對映建立任務的超負荷開始逐步控制總的作業執行時間。
  • 對於大多數作業,最好是分割成大小等於一個HDFS塊的大小(這是64 MB,預設情況下)。
  • map任務執行結果到輸出寫入到本地磁碟的各個節點上,而不是HDFS。
  • 之所以選擇本地磁碟而不是HDFS是因為,避免複製其中發生 HDFS 儲存操作。
  • 對映輸出是由減少任務處理以產生最終的輸出中間輸出。
  • 一旦任務完成,對映輸出可以扔掉了。所以,複製並將其儲存在HDFS變得大材小用。
  • 在節點故障的對映輸出之前,由 reduce 任務消耗,Hadoop 重新執行另一個節點在對映上的任務,並重新建立的對映輸出。
  • 減少任務不會在資料區域性性的概念上工作。每個map任務的輸出被供給到 reduce 任務。對映輸出被傳輸至計算機,其中 reduce 任務正在執行。
  • 在此機器輸出合併,然後傳遞到使用者定義的 reduce 函式。
  • 不像到對映輸出,reduce輸出儲存在HDFS(第一個副本被儲存在本地節點上,其他副本被儲存於偏離機架的節點)。因此,寫入 reduce 輸出

MapReduce如何組織工作?

Hadoop 劃分工作為任務。有兩種型別的任務:

  1. Map 任務 (分割及對映)
  2. Reduce 任務 (重排,還原)

如上所述

完整的執行流程(執行 Map 和 Reduce 任務)是由兩種型別的實體的控制,稱為

  1. Jobtracker : 就像一個主(負責提交的作業完全執行)
  2. 多工跟蹤器 : 充當角色就像從機,它們每個執行工作

對於每一項工作提交執行在系統中,有一個 JobTracker 駐留在 Namenode 和 Datanode 駐留多個 TaskTracker。

  • 作業被分成多個任務,然後執行到叢集中的多個資料節點。
  • JobTracker的責任是協調活動排程任務來在不同的資料節點上執行。
  • 單個任務的執行,然後由 TaskTracker 處理,它位於執行工作的一部分,在每個資料節點上。
  • TaskTracker 的責任是傳送進度報告到JobTracker。
  • 此外,TaskTracker 周期性地傳送“心跳”信號資訊給 JobTracker 以便通知系統它的當前狀態。
  • 這樣 JobTracker 就可以跟蹤每項工作的總體進度。在任務失敗的情況下,JobTracker 可以在不同的 TaskTracker 重新排程它。