悟懂MapReduce,不糾結!

在《谷歌 MapReduce 初探》中,咱們經過統計詞頻的 WordCount 經典案例,對 Google 推出的 MapReduce 編程模型有了一個認識,可是那種認識,還只是停留在知道有那麼個模型存在,並無認識到骨子裏。並且上次初探,也遺留了不少猜測和疑問,此次不妨讓咱們深刻去認識一下 MapReduce,但願能達到一個質的認識。面試

重點回顧

MapReduce 主要思想是分治法。採起分而治之的思想,將一個大規模的問題,分紅多個小規模的問題,把多個小規模問題解決,而後再合併小規模問題的結果,就可以解決大規模的問題。算法

這麼聊下去,我感受會讓大家很懵圈!那不妨舉點栗子,舉慄解千愁。編程

舉個不太恰當的栗子,不知道你們有沒有在農村掰過玉米,我小時候尚未自動收割機,每當玉米熟了的時候,都是靠人工去掰。要是家庭裏只有一個勞動力,那隻能一壠一壠的去掰;若是家庭勞動力比較多,就能夠分配任務,同時去掰多壠玉米,人手一壠玉米,掰的過程放到籃子裏或者地上就行,由於有專門的人手負責打包裝車,這樣很快一畝地就掰完了,並且能很快統計出掰了幾車玉米。數組

人多力量大,不知道你們可否感覺到一絲「分而治之」的理念;多個勞動力人手一行玉米,不知道你們有沒有感受到一絲 「MapReduce 之 Map」的概念;專門的人力負責打包裝車,不知道你們有沒有感受到一絲「Map Reduce 之 Reduce」的概念。ide

再爲你假設一個場景,面試的時候給你一個數組:{10,6,7,1,3,9,4,2} 要實現排序。函數

實現方式會有千萬種,而咱們只提「歸併排序」,由於它是創建在歸併操做上的一種有效的排序算法,而且是採用分治法(Divide and Conquer)的一個很是典型的應用。大數據

如上圖示意,歸併排序的過程已經把分治的思想表達的很清楚了,有對算法感興趣的能夠自行深刻。spa

一圖解千愁

爲了咱們更清晰的瞭解 MapReduce 的流程,懶癌犯了,就不畫圖了,肆意找了一張圖貼上。圖上字字珠璣,必定要好好揣摩要傳達的意思,切記必定要記住整個流程(重點是分區,歸併)。blog

重拾案例

經過上面不太恰當的例子和圖,稍微對 MapRedcue 的思想抽象了一下,不知道你們有沒有什麼感觸呢?接下來讓咱們重拾上次分享提到的「WordCount」的經典案例,窺探一下具體的執行過程。排序

剖析背後。如圖示意,主要參與者角色分爲 User Program、Master 以及系列 Worker。

User Program 顧名思義就是咱們實現好的業務邏輯處理的 MapReduce 程序代碼;

Master 從圖中也可以看出來承擔了任務分配,可以把任務指派給 map worker 和 reduce worker(應該會存儲一些元數據,記錄哪些數據要給哪些 map worker,哪些數據要給哪些 reduce worker),猜測應該也會跟蹤維護任務的狀態;其實也就是皇上,掌控全局。

Worker 從圖中可以看出主要分爲 Map Worker、Reduce Worker。

Map Worker 從圖中也能看出來負責接收用戶的輸入,而後執行用戶實現的 map 操做,結果寫入本地中間文件。

Reduce Worker 從圖中能夠看出來可以讀取 Map Worker 產生的中間文件,並執行用戶實現的 reduce 操做,並把結果輸出(例如寫到 GFS 存儲)。

如何運轉?這裏要提一本書《大數據技術原理與應用》,由於下面這段剖析來自於這本書。

(1)執行 WordCount 的用戶程序(採用 MapReduce 編寫),會被系統分發部署到集羣中的多臺機器上,其中一臺機器做爲 Master,負責協調調度做業的執行,其他機器做爲 Worker,能夠執行 Map 或 Reduce 任務。

(2)系統分配一部分 Worker 執行 Map 任務,一部分 Worker 執行 Reduce 任務;MapReduce 將輸入文件切分紅 M 個分片,Master 將 M 個分片分給處於空閒狀態的 N 個 Worker 來處理。

(3)執行 Map 任務的 Worker 讀取輸入文件,執行 Map 操做,生成一系列 <key,value> 形式的中間結果,並將中間結果保存在內存的緩衝區中。

(4)緩衝區中的中間結果會被按期刷寫到本地磁盤上,並被劃分爲 R 個分區,這 R 個分區會被分發給 R 個執行 Reduce 任務的 Worker 進行處理;Master 會記錄這 R 個分區在磁盤上的存儲位置,並通知 R 個執行 Reduce 任務的 Worker 來「領取」屬於本身處理的那些分區的數據。

(5)執行 Reduce 任務的 Worker 收到 Master 的通知後,就到相應的 Map 機器上「領回」屬於本身處理的分區。不過可能會從多個 Map 機器上領取數據,所以當全部 Map 機器上的屬於本身處理的數據都已經領取回來之後,這個 Reduce 任務的 Worker 會對領取的鍵值對進行排序(若是內存中放不下須要用到外部排序),使得具備相同 Key 的鍵值對彙集在一塊兒,而後就能夠開始執行具體的 Reduce 操做了。

(6)執行 Reduce 任務的 Worker 遍歷中間數據,對每個惟一 key 進行 Reduce 函數,結果寫入到輸出文件中;執行完畢後,喚醒用戶程序,返回結果。

可靠性保證?

Master 的可用性?認爲 Master 掛掉概率很小,若是掛掉任務就執行失敗。

Worker 的可用性?Master 每隔一段時間會 ping 每一個 Worker,若是 Worker 長時間沒回復,Master 就將它標記爲失效。若是失效的的 Worker 執行的是 Map 任務,則須要通知對應的 reduce 的 Worker 節點去新的 Map Worker 節點拿輸入數據。

答疑解惑

針對上期遺留的問題逐個進行剖析解答。

猜測:map、reduce 函數中間感受又觸發了「針對同一個單詞的 value 的組合(也就是把相同單詞出現的次數,串在一塊兒)」,否則 reduce 函數怎麼能接收到 values(每一個單詞對應的出現次數的一串「1」)。

這不就是歸併的事情麼!在「一圖解千愁」以及「如何運轉?」環節中均有答案!

疑問 1:map 產生的中間鍵值對,是放到內存、本地磁盤仍是放到了 GFS 上存儲?

在「一圖解千愁」以及「如何運轉?」環節中均有答案!

疑問 2:咱們寫好了 Map 函數和 Reduce 函數,怎麼就跑到了多臺機器上呢?

在「如何運轉?」環節中已經有答案!

好了,這篇分享都到這兒吧,但願大家可以喜歡,若是感受有點幫助,那就動動手指轉發分享一下吧。

相關文章
相關標籤/搜索