mapreduce原理簡單敘述

概述

  1. mapreduce簡介
  2. master運作
  3. worker運作
  4. 從mapreduce看分布式程序

本文假設讀者對mapreduce的概念有所理解,主要講解運行執(zhí)行過程!所以至少你得知道m(xù)ap函數(shù)reduce函數(shù)式怎么寫的。

1. mapreduce簡介

mapreduce是一個分布式框架,用于大規(guī)模數(shù)據(jù)集的并行運算。簡單來說,就是框架通過協(xié)作成千上萬的機器來計算你的數(shù)據(jù)。這個東西大概長這個鬼樣:

mapreduce運行交互圖

上圖可以很好的說明mapreduce是如何協(xié)作成千上萬臺機器的。在框架中有個叫master的角色,負責接受任務分發(fā)給workers,等待workers完成任務,即可返回給用戶。是不是很簡單?不錯,就是這樣!

特別注意一下,mapreduce是基于一個分 布式文件系統(tǒng)的(有個東西叫GFS)。為啥要基于一個分布式文件系統(tǒng)?后面會講到。

通過mapreduce來進行計算任務,你只需要提供三個東西給master:

  1. 需要計算的數(shù)據(jù)
  2. map函數(shù)
  3. 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主要作用是:

  1. 接受worker的注冊
  2. 接收任務
  3. 調(diào)度worker進行任務的計算,確保任務計算成功
  4. 整合計算結果返回

master與worker一般位于不同的機器上,通信可以通過rpc。

3. worker運作

worker是主要計算過程的實現(xiàn),而計算過程主要是map過程和reduce過程,所以這里主要講述map過程的實現(xiàn)和reduce過程的實現(xiàn)!這里起到最要作用的就是分布式文件系統(tǒng),這個文件系統(tǒng)主要用于存儲中間計算結果。

3.1. map過程

Paste_Image.png

我們知道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的都在同一個文件中,所以基本就是一對一:

Paste_Image.png

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é)點的容錯性!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容