概述
- mapreduce簡介
- master運作
- worker運作
- 從mapreduce看分布式程序
本文假設讀者對mapreduce的概念有所理解,主要講解運行執(zhí)行過程!所以至少你得知道m(xù)ap函數(shù)reduce函數(shù)式怎么寫的。
1. mapreduce簡介
mapreduce是一個分布式框架,用于大規(guī)模數(shù)據(jù)集的并行運算。簡單來說,就是框架通過協(xié)作成千上萬的機器來計算你的數(shù)據(jù)。這個東西大概長這個鬼樣:

上圖可以很好的說明mapreduce是如何協(xié)作成千上萬臺機器的。在框架中有個叫master的角色,負責接受任務分發(fā)給workers,等待workers完成任務,即可返回給用戶。是不是很簡單?不錯,就是這樣!
特別注意一下,mapreduce是基于一個分
布式文件系統(tǒng)的(有個東西叫GFS)。為啥要基于一個分布式文件系統(tǒng)?后面會講到。
通過mapreduce來進行計算任務,你只需要提供三個東西給master:
- 需要計算的數(shù)據(jù)
- map函數(shù)
- reduce函數(shù)
master收到上面三個東東,即可開始一次mapreduce的計算過程,大概是
1. master切割需要計算的數(shù)據(jù)集A為n小片(好讓每個worker計算量變小,分散計算)
2. master把任務分給worker執(zhí)行map過程(每次只針對一個小片數(shù)據(jù)),輸出中間結果B
3. master把任務分割worker執(zhí)行reduce過程,reduce過程讀取步驟2的中間結果B來計算,產(chǎn)生計算結果C
4. master合并計算結果C產(chǎn)生D返回
由上面可以看出,想要理解mapreduce的計算原理,只要知道數(shù)據(jù)ABCD是如何產(chǎn)生以及被計算的即可。其中最有意思的是結果B的產(chǎn)生,后面章節(jié)worker會講到。
2. master運作
master的運作比較簡單,主要作為任務分發(fā),并不涉及到具體的計算任務。master主要作用是:
- 接受worker的注冊
- 接收任務
- 調(diào)度worker進行任務的計算,確保任務計算成功
- 整合計算結果返回
master與worker一般位于不同的機器上,通信可以通過rpc。
3. worker運作
worker是主要計算過程的實現(xiàn),而計算過程主要是map過程和reduce過程,所以這里主要講述map過程的實現(xiàn)和reduce過程的實現(xiàn)!這里起到最要作用的就是分布式文件系統(tǒng),這個文件系統(tǒng)主要用于存儲中間計算結果。
3.1. map過程

我們知道m(xù)aster已經(jīng)把要計算的原始數(shù)據(jù)分片了。假如分片x需要進行map過程,分片里面的內(nèi)容會被讀取出來執(zhí)行map函數(shù)。然后得到一個KeyValue的列表。這些KeyValue會被寫入到中間臨時文件中,就是上圖的tmp文件。
這里有意思的是一個分片的計算中間結果會被寫入到多個tmp文件中,至于寫到哪個tmp文件中?hash算法出來幫忙。這樣做的目的主要是為了同一個Key的計算結果保證在同一個tmp文件中。
分布式文件系統(tǒng)的作用?
這里的文件都是基于分布式文件系統(tǒng)的,所以tmp1文件可以被所有worker訪問寫入,這也就是分布式文件系統(tǒng)的貢獻。
經(jīng)過Map過程,同一個Key的計算結果能保證在同一個文件中。所以,reduce計算過程也就不用跨越文件去尋找Key的計算結果了。
這里有個技巧的地方就是tmp臨時文件的命名。由于reduce過程需要用到這些文件,
所以我們只需要按照一定的規(guī)則命名,reduce過程直接讀取就行,沒必要顯示式傳參數(shù)。
例如:
mrtmp-{任務名}-{map任務id}-{hash id}
3.2. reduce過程
reduce過程就比較簡單了,目的就是合并相同Key的結果。由于相同Key的都在同一個文件中,所以基本就是一對一:

3.3. merge過程
這個過程就是將多個merge臨時文件合并成一個結果輸出。這個步驟簡單到不想講了。
4. 從mapreduce看分布式程序
從mapreduce的計算過程,我覺得有兩點是對于分布式程序非常有價值的啟發(fā),雖然上面都沒講到,主要講計算過程,哈哈。
第一點,冪等性
啥是冪等性?就是一件事你干一次和干n次結果都是一樣!
為啥這里需要冪等性?
因為每一個worker都可能失聯(lián)!失聯(lián)?對,就是失聯(lián),不知道worker干嘛去了,反正聯(lián)系不上。也許crash掉了?也許是網(wǎng)絡抖動?不重要,聯(lián)系不上你我就有可能需要叫其他worker來幫忙完成失聯(lián)的worker未交待完成的任務。這時候一個任務就可能被執(zhí)行兩次,所以需要保證冪等性。計算多次,同一個結果!很好
第二點,容錯性
啥事容錯性?就是允許出錯啊!這個主要是靠master來協(xié)調(diào)了。某個worker出錯了master得保證把任務交給其他worker執(zhí)行啊。這樣worker想跪就可以放心的跪是吧,反正有別人替我完成!那么master跪了咋辦?這個有點麻煩,因為master是有狀態(tài)的。(保存著任務的執(zhí)行狀態(tài),worker狀態(tài)),所以master跪了是一件很麻煩的事情,后續(xù)會繼續(xù)關注有狀態(tài)的節(jié)點的容錯性!