MapReduce過程詳解

SunnyRivers發表於2019-04-29

MapReduce是一種雲端計算的核心計算模式,是一種分散式運算技術,也是簡化的分散式並行程式設計模式,主要用於大規模並行程式並行問題。

MapReduce的主要思想:

自動將一個大的計算(程式)拆分成Map(對映)和Reduce(化簡)的方式。

流程圖如下:

MapReduce過程詳解
資料被分割後通過Map函式將資料對映成不同的區塊,分配給計算叢集進行處理,以達到分佈運算的效果,再通過Reduce函式將結果進行彙整,從而輸出開發者所需要的結果。

MapReduce借鑑了函式式程式設計語言的思想,其軟體實現是指定一個Map函式,把鍵值對(Key/Value)對映成一個新的鍵值對(Key/Value),形成一系列中間結果形式的(Key/Value),然後把它們傳遞給Reduce函式,把具有相同中間形式Key的Value合併在一起。Map函式和Reduce函式具有一定的關聯性。

接下來從Shuffler來詳細描述Map和Reduce的細節

MapReduce過程詳解

Shuffler就是reduce從map拉取資料的過程。(說的形象一點就是:將資料重新打亂匯聚到不同節點的過程,當然相同key需要匯聚在同一個節點)

以WordCount為例,假設有8個MapTask和3個ReduceTask

Map端整個流程分為4步:

(1)在MapTask執行時,其輸入資料來源於HDFS的Block。Split和Block預設對應關係是一對一。在WordCount例子中,假設Map的輸入資料都是像“aaa”這樣的字串。

(2)在經過Mapper執行後,輸出是這樣一個Key/Value對:Key是“aaa”,Value是1。我們知道這個Job有3個ReduceTask,到底“aaa”應該交由哪個Reducer去處理,是需要現在決定的。MapReduce提供了Partitioner介面,其作用是根據Key或Value及Reduce的數量來決定當前這對輸出資料最終應該交由哪個ReduceTask處理。預設對Key進行雜湊運算後,再以ReduceTask數量取模。在該例中,“aaa”經過Partition(分割槽)後返回0,也就是這對輸出資料應當由第一個Reducer來處理。接下來需要將資料寫入記憶體緩衝區中。緩衝區的作用就是批量收集Map結果,減少磁碟I/O影響。

(3)記憶體緩衝區的大小是有限的,預設是100MB。當MapTask輸出結果有很多時,記憶體可能會不足,所以需要在一定條件下將緩衝區中的資料臨時寫入磁碟,然後重新利用這個緩衝區。這個從記憶體往磁碟寫資料的過程被稱為Spill,中文譯為溢寫。

(4)每一次溢寫都會在磁碟上生成一個溢寫檔案,如果Map輸入結果很大,就會有多次這樣的溢寫發生,磁碟上就會有多個溢寫檔案存在。當MapTask真正完成時,記憶體緩衝區中的資料將全部溢寫到磁碟中形成一個溢寫檔案。最紅磁碟中會至少有這樣的一個溢寫檔案存在(如果Map的輸出結果很少(小於100MB),那麼當Map執行完成時,只會產生一個溢寫檔案)。因為最終的檔案只有一個,所以需要將這些溢寫檔案歸併(使用歸併演算法)到一起,這個過程就是Merge。至此,Map端所有工作都已結束。

每個ReduceTask不斷地通過RPC(HTTP協議)從JobTracker(Hadoop2.0有了Yarn之後,是ResourceManager)那裡獲取MapTask是否完成資訊。如果ReduceTask獲知某臺TaskTraker(Hadoop2.x中為AppMaster)上的MapTask執行完成,那麼Shuffler的後半段過程開始啟動。簡單地說,ReduceTask在執行之前的工作就是不斷地拉取當前Job裡的每個MapTask的最終結果,然後對不同地方拉取過來的資料不斷地進行Merge,最終形成一個檔案作為ReduceTask的輸入檔案。

Reduce端整個流程分為3步:

(1)Copy過程。即簡單地拉取資料。Reduce程式啟動一些資料copy執行緒(Fetcher),通過HTTP方式請求MapTask所在的TaskTracker獲取MapTask的輸出檔案。因為MapTask早已結束,所以這些檔案就由TaskTracker管理。

(2)Merge階段。同Map端的Merge動作,只是陣列中存放的是不同Map端複製過來的資料。複製過來 資料會先放到記憶體緩衝區中,當記憶體中的資料達到一定閾值時,就會啟動記憶體到磁碟的Merge。與Map端類似,這也是溢寫過程,會在磁碟中形成眾多的溢寫檔案,然後將這些溢寫檔案進行歸併。

(3)Reducer的輸出檔案。不斷地進行Merge後,最後會生成一個“最終檔案”。這個檔案可能存放在磁碟,也可能存放在記憶體中,預設存放在磁碟上。當Reducer的輸入檔案已定時,整個Shuffle過程才最終結束。

這裡給出一個巨集觀的流程圖:

MapReduce過程詳解

總結

map每次讀取split的資料(一行一行的讀取)後先放在buffer緩衝區中,然後進行分割槽、排序、當緩衝區滿了之後,會進行溢寫磁碟。磁碟中會生成很多個溢寫小檔案,而這些小檔案內部是有序的,但小檔案和小檔案之間是無序的,所以需要進行一次歸併形成一個全盤有序的檔案。 由於一個split對應一個map,reduce端是從多個map中拉取資料,所以也需要進行歸併為一個有序的檔案,最終每個相同的key分為一組執行一次reduce方法。

來自

相關文章