大數(shù)據(jù)核心框架MapReduce過(guò)程解析
首先MapReduce很明顯是分為Map階段和Reduce階段。兩個(gè)階段分別做什么呢?
小編自己畫了個(gè)圖,大家共勉一下

圖中1-2過(guò)程為map過(guò)程,3為Reduce過(guò)程,接下來(lái)看一張專業(yè)圖片,兩張對(duì)比一起看

在整個(gè)mapReduce過(guò)程包含很多復(fù)雜的處理過(guò)程,而我們要學(xué)習(xí)的就是其中幾個(gè)過(guò)程包含,Split過(guò)程、Partitione過(guò)程還有Shuffle過(guò)程,舉一個(gè)實(shí)例的話
假設(shè)我們手上有很多復(fù)雜數(shù)據(jù),那么怎樣來(lái)處理呢? 第一步就是分類,把數(shù)據(jù)分類。 分類后的數(shù)據(jù)就不復(fù)雜了,這就是異而化同。 分類之后數(shù)據(jù)還是很多,怎么辦呢? 第二步,分割。 分割就是把數(shù)據(jù)切分成小塊, 這樣就可以并發(fā)或者批量處理了, 這就是大而化小。
回到 map-reduce概念上, map的工作就是切分?jǐn)?shù)據(jù),然后給他們分類,分類的方式就是輸出key,value對(duì),key就是對(duì)應(yīng)“類別”了。 分類之后,reducer拿到的都是同類數(shù)據(jù),這樣處理就很容易了。
大數(shù)據(jù)一般采用的HDFS 解決了大數(shù)據(jù)存儲(chǔ)的問題,那么 MapReduce 自然要解決的是數(shù)據(jù)計(jì)算問題在處理大數(shù)據(jù)計(jì)算中,一臺(tái)機(jī)器是無(wú)法滿足大批量數(shù)據(jù)計(jì)算的,這個(gè)時(shí)候就需要使用MapReduce,MapReduce是一種編程模型,用于大規(guī)模數(shù)據(jù)集的并行計(jì)算,需要將數(shù)據(jù)分配到大量的機(jī)器上計(jì)算,每臺(tái)機(jī)器運(yùn)行一個(gè)子計(jì)算任務(wù),最后再合并每臺(tái)機(jī)器運(yùn)算結(jié)果并輸出。 MapReduce 的思想就是 『分而治之』
MapReduce 將整個(gè)并行計(jì)算過(guò)程抽象到兩個(gè)函數(shù),在 Map 中進(jìn)行數(shù)據(jù)的讀取和預(yù)處理,之后將預(yù)處理的結(jié)果發(fā)送到 Reduce 中進(jìn)行合并。一個(gè)簡(jiǎn)單的 MapReduce 程序只需要指定 map()、reduce()、 input 和output,剩下的事由框架完成。
Map ( 映射 ) : 對(duì)一些獨(dú)立元素組成的列表的每一個(gè)元素進(jìn)行指定的操作,可以高度并行。
Reduce( 化簡(jiǎn) ) : 對(duì)一個(gè)列表的元素進(jìn)行合并。
MapReduce執(zhí)行流程
以經(jīng)典的 WordCount 的例子來(lái)說(shuō)明一下MapReduce的執(zhí)行流程,WordCount就是統(tǒng)計(jì)每個(gè)單詞出現(xiàn)的次數(shù)。

MapReduce計(jì)算框架的一般流程有以下幾個(gè)步驟:
輸入 ( Input ) 和拆分 ( Split ):
對(duì)數(shù)據(jù)進(jìn)行分片處理。將源文件內(nèi)容分片成一系列的 InputSplit,每個(gè) InputSplit 存儲(chǔ)著對(duì)應(yīng)分片的數(shù)據(jù)信息,記住是對(duì)文件內(nèi)容進(jìn)行分片,并不是將源文件拆分成多個(gè)小文件。
迭代 ( iteration ):
遍歷輸入數(shù)據(jù),并將之解析成 key/value 對(duì)。拆分?jǐn)?shù)據(jù)片經(jīng)過(guò)格式化成鍵值對(duì)的格式,其中 key 為偏移量,value 是每一行的內(nèi)容,這一步由MapReduce框架自動(dòng)完成。
映射 ( Map ):
將輸入 key/value 對(duì)映射 ( map ) 成另外一些 key/value 對(duì)。MapReduce 開始在機(jī)器上執(zhí)行 map 程序,map 程序的具體實(shí)現(xiàn)由我們自己定義,對(duì)輸入的 key/value 進(jìn)行處理,輸出新的 key/value,這也是hadoop 并行事實(shí)發(fā)揮作用的地方。
洗牌 ( Shuffer ) 過(guò)程:
依據(jù) key 對(duì)中間數(shù)據(jù)進(jìn)行分組 ( grouping )。這是一個(gè)洗牌的過(guò)程,得到map方法輸出的 對(duì)后,Mapper 會(huì)將它們按照 key 值進(jìn)行處理,這包括 sort (排序)、combiner (合并)、partition (分片) 等操作達(dá)到排序分組和均衡分配,得到 Mapper 的最終輸出結(jié)果交給 Reducer。mapper 和 reducer 一般不在一個(gè)節(jié)點(diǎn)上,這就導(dǎo)致了reducer 需要從不同的節(jié)點(diǎn)上下載數(shù)據(jù),經(jīng)過(guò)處理后才能交給 reducer 處理。
歸并( Reduce ):
以組為單位對(duì)數(shù)據(jù)進(jìn)行歸約 ( reduce )。Reducer 先對(duì)從 Mapper 接收的數(shù)據(jù)進(jìn)行排序,再交由用戶自定義的 reduce方法進(jìn)行處理。
迭代:
將最終產(chǎn)生的 key/value 對(duì)保存到輸出文件中。得到新的 對(duì),保存到輸出文件中,即保存在 HDFS 中。