MapReduce工作流程

weixin_34365417發表於2016-10-19

MapReduce如何工作:

MapReduce程式的工作分兩個階段進行:
Map階段
Reduce 階段
輸入到每一個階段均是鍵 - 值對。此外,每一個程式設計師需要指定兩個函式:map函式和reduce函式,整個過程要經歷三個階段執行。

1724098-4d356502b4b92c8e.png
MapReduce工作過程.png

這些資料經過以下幾個階段
1、輸入拆分:
輸入到MapReduce工作被劃分成固定大小的塊叫做 input splits ,輸入折分是由單個對映消費輸入塊。
2、對映 - Mapping
這是在 map-reduce 程式執行的第一個階段。在這個階段中的每個分割的資料被傳遞給對映函式來產生輸出值。在我們的例子中,對映階段的任務是計算輸入分割出現每個單詞的數量(更多詳細資訊有關輸入分割在下面給出)並編制以某一形式列表<單詞,出現頻率>
3、重排
這個階段消耗對映階段的輸出。它的任務是合併對映階段輸出的相關記錄。在我們的例子,同樣的詞彙以及它們各自出現頻率。
4、Reducing
在這一階段,從重排階段輸出值彙總。這個階段結合來自重排階段值,並返回一個輸出值。總之,這一階段彙總了完整的資料集。
在我們的例子中,這個階段彙總來自重排階段的值,計算每個單詞出現次數的總和。

詳細的整個過程

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

MapReduce如何組織工作:
Hadoop 劃分工作為任務。有兩種型別的任務:
Map 任務 (分割及對映)
Reduce 任務 (重排,還原)
完整的執行流程(執行 Map 和 Reduce 任務)是由兩種型別的實體的控制,稱為
Jobtracker : 就像一個主(負責提交的作業完全執行)
多工跟蹤器 : 充當角色就像從機,它們每個執行工作
對於每一項工作提交執行在系統中,有一個 JobTracker 駐留在 Namenode 和 Datanode 駐留多個 TaskTracker。


1724098-bf546a0b522512a4.png

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

相關文章