MapReduce如何工作:
MapReduce程序的工作分兩個階段進行:
Map階段
Reduce 階段
輸入到每一個階段均是鍵 - 值對。此外,每一個程序員需要指定兩個函數(shù):map函數(shù)和reduce函數(shù),整個過程要經(jīng)歷三個階段執(zhí)行。

這些數(shù)據(jù)經(jīng)過以下幾個階段
1、輸入拆分:
輸入到MapReduce工作被劃分成固定大小的塊叫做 input splits ,輸入折分是由單個映射消費輸入塊。
2、映射 - Mapping
這是在 map-reduce 程序執(zhí)行的第一個階段。在這個階段中的每個分割的數(shù)據(jù)被傳遞給映射函數(shù)來產(chǎn)生輸出值。在我們的例子中,映射階段的任務(wù)是計算輸入分割出現(xiàn)每個單詞的數(shù)量(更多詳細信息有關(guān)輸入分割在下面給出)并編制以某一形式列表<單詞,出現(xiàn)頻率>
3、重排
這個階段消耗映射階段的輸出。它的任務(wù)是合并映射階段輸出的相關(guān)記錄。在我們的例子,同樣的詞匯以及它們各自出現(xiàn)頻率。
4、Reducing
在這一階段,從重排階段輸出值匯總。這個階段結(jié)合來自重排階段值,并返回一個輸出值??傊?,這一階段匯總了完整的數(shù)據(jù)集。
在我們的例子中,這個階段匯總來自重排階段的值,計算每個單詞出現(xiàn)次數(shù)的總和。
詳細的整個過程
映射的任務(wù)是為每個分割創(chuàng)建在分割每條記錄執(zhí)行映射的函數(shù)。
有多個分割是好處的, 因為處理一個分割使用的時間相比整個輸入的處理的時間要少, 當分割比較小時,處理負載平衡是比較好的,因為我們正在并行地處理分割。
然而,也不希望分割的規(guī)模太小。當分割太小,管理分割和映射創(chuàng)建任務(wù)的超負荷開始逐步控制總的作業(yè)執(zhí)行時間。
對于大多數(shù)作業(yè),最好是分割成大小等于一個HDFS塊的大小(這是64 MB,默認情況下)。
map任務(wù)執(zhí)行結(jié)果到輸出寫入到本地磁盤的各個節(jié)點上,而不是HDFS。
之所以選擇本地磁盤而不是HDFS是因為,避免復(fù)制其中發(fā)生 HDFS 存儲操作。
映射輸出是由減少任務(wù)處理以產(chǎn)生最終的輸出中間輸出。
一旦任務(wù)完成,映射輸出可以扔掉了。所以,復(fù)制并將其存儲在HDFS變得大材小用。
在節(jié)點故障的映射輸出之前,由 reduce 任務(wù)消耗,Hadoop 重新運行另一個節(jié)點在映射上的任務(wù),并重新創(chuàng)建的映射輸出。
減少任務(wù)不會在數(shù)據(jù)局部性的概念上工作。每個map任務(wù)的輸出被供給到 reduce 任務(wù)。映射輸出被傳輸至計算機,其中 reduce 任務(wù)正在運行。
在此機器輸出合并,然后傳遞到用戶定義的 reduce 函數(shù)。
不像到映射輸出,reduce輸出存儲在HDFS(第一個副本被存儲在本地節(jié)點上,其他副本被存儲于偏離機架的節(jié)點)。因此,寫入 reduce 輸出
MapReduce如何組織工作:
Hadoop 劃分工作為任務(wù)。有兩種類型的任務(wù):
Map 任務(wù) (分割及映射)
Reduce 任務(wù) (重排,還原)
完整的執(zhí)行流程(執(zhí)行 Map 和 Reduce 任務(wù))是由兩種類型的實體的控制,稱為
Jobtracker : 就像一個主(負責提交的作業(yè)完全執(zhí)行)
多任務(wù)跟蹤器 : 充當角色就像從機,它們每個執(zhí)行工作
對于每一項工作提交執(zhí)行在系統(tǒng)中,有一個 JobTracker 駐留在 Namenode 和 Datanode 駐留多個 TaskTracker。

1、作業(yè)被分成多個任務(wù),然后運行到集群中的多個數(shù)據(jù)節(jié)點。
2、JobTracker的責任是協(xié)調(diào)活動調(diào)度任務(wù)來在不同的數(shù)據(jù)節(jié)點上運行。
3、單個任務(wù)的執(zhí)行,然后由 TaskTracker 處理,它位于執(zhí)行工作的一部分,在每個數(shù)據(jù)節(jié)點上。
4、TaskTracker 的責任是發(fā)送進度報告到JobTracker。
5、此外,TaskTracker 周期性地發(fā)送“心跳”信號信息給 JobTracker 以便通知系統(tǒng)它的當前狀態(tài)。
6、這樣 JobTracker 就可以跟蹤每項工作的總體進度。在任務(wù)失敗的情況下,JobTracker 可以在不同的 TaskTracker 重新調(diào)度它。