MapReduce 是適合海量數(shù)據(jù)處理的編程模型。Hadoop是能夠運(yùn)行在使用各種語(yǔ)言編寫的MapReduce程序: Java, Ruby, Python, and C++. MapReduce程序是平行性的,因此可使用多臺(tái)機(jī)器集群執(zhí)行大規(guī)模的數(shù)據(jù)分析非常有用的。
MapReduce程序的工作分兩個(gè)階段進(jìn)行:
輸入到每一個(gè)階段均是鍵 - 值對(duì)。此外,每一個(gè)程序員需要指定兩個(gè)函數(shù):map函數(shù)和reduce函數(shù)
整個(gè)過程要經(jīng)歷三個(gè)階段執(zhí)行,即
讓我們用一個(gè)例子來理解這一點(diǎn) –
假設(shè)有以下的輸入數(shù)據(jù)到 MapReduce 程序,統(tǒng)計(jì)以下數(shù)據(jù)中的單詞數(shù)量:
Welcome to Hadoop Class
Hadoop is good
Hadoop is bad
MapReduce 任務(wù)的最終輸出是:
bad |
1 |
Class |
1 |
good |
1 |
Hadoop |
3 |
is |
2 |
to |
1 |
Welcome |
1 |
這些數(shù)據(jù)經(jīng)過以下幾個(gè)階段
輸入拆分:
輸入到MapReduce工作被劃分成固定大小的塊叫做 input splits ,輸入折分是由單個(gè)映射消費(fèi)輸入塊。
映射 - Mapping
這是在 map-reduce 程序執(zhí)行的第一個(gè)階段。在這個(gè)階段中的每個(gè)分割的數(shù)據(jù)被傳遞給映射函數(shù)來產(chǎn)生輸出值。在我們的例子中,映射階段的任務(wù)是計(jì)算輸入分割出現(xiàn)每個(gè)單詞的數(shù)量(更多詳細(xì)信息有關(guān)輸入分割在下面給出)并編制以某一形式列表<單詞,出現(xiàn)頻率>
重排
這個(gè)階段消耗映射階段的輸出。它的任務(wù)是合并映射階段輸出的相關(guān)記錄。在我們的例子,同樣的詞匯以及它們各自出現(xiàn)頻率。
Reducing
在這一階段,從重排階段輸出值匯總。這個(gè)階段結(jié)合來自重排階段值,并返回一個(gè)輸出值??傊@一階段匯總了完整的數(shù)據(jù)集。
在我們的例子中,這個(gè)階段匯總來自重排階段的值,計(jì)算每個(gè)單詞出現(xiàn)次數(shù)的總和。
Hadoop 劃分工作為任務(wù)。有兩種類型的任務(wù):
如上所述
完整的執(zhí)行流程(執(zhí)行 Map 和 Reduce 任務(wù))是由兩種類型的實(shí)體的控制,稱為
對(duì)于每一項(xiàng)工作提交執(zhí)行在系統(tǒng)中,有一個(gè) JobTracker 駐留在 Namenode 和 Datanode 駐留多個(gè) TaskTracker。