MapReduce 是適合海量資料處理的程式設計模型。Hadoop是能夠執行在使用各種語言編寫的MapReduce程式: Java, Ruby, Python, and C++. MapReduce程式是平行性的,因此可使用多台機器叢集執行大規模的資料分析非常有用的。
MapReduce程式的工作分兩個階段進行:
輸入到每一個階段均是鍵 - 值對。此外,每一個程式員需要指定兩個函式:map函式和reduce函式
整個過程要經歷三個階段執行,即
讓我們用一個例子來理解這一點 –
假設有以下的輸入資料到 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
在這一階段,從重排階段輸出值彙總。這個階段結合來自重排階段值,並返回一個輸出值。總之,這一階段匯總了完整的資料集。
在我們的例子中,這個階段匯總來自重排階段的值,計算每個單詞出現次數的總和。
Hadoop 劃分工作為任務。有兩種型別的任務:
如上所述
完整的執行流程(執行 Map 和 Reduce 任務)是由兩種型別的實體的控制,稱為
對於每一項工作提交執行在系統中,有一個 JobTracker 駐留在 Namenode 和 Datanode 駐留多個 TaskTracker。