天天看點

MapReduce執行流程解析

本文基于hadoop2.x,以wordcount為例解析MapReduce執行流程。

注:假設HDFS中有兩個檔案。分别為1.txt(150M),2.txt(100M)

1.Map階段

步驟:

(1)hadoop掃描指定路徑下的所有檔案,本文指的是1.txt和2.txt,并将其進行邏輯切片(也可稱為邏輯規劃),每個切片被稱為split。通常切片大小與block大小保持一緻。本文中兩個檔案将被切分為三個部分,記為split1,split2,split3。

      注:

     <1>邏輯切片不是真的将檔案切割成不同的部分,而是進行規劃,沒有實際操作。

     <2>切片大小為什麼要和block大小保持一緻?是否可以不一緻?這個問題将在後續文章中詳細解答。

(2)hadoop為每一個分片建構一個map任務,稱為maptask,并由該任務運作使用者程式。

(3)hadoop的TextInputFormat元件從HDFS将1.txt,2.txt一行一行讀取,然後封裝為key-value對,傳入使用者程式。

      注:

     <1>TextInputFormat元件每讀取一行,就會封裝一次key-value對,調用一次使用者重寫的map方法,然後執行context.write(k,v)将運算結果輸出。

(4)如果程式中設定job.setNumReduceTask的值大于1,會将map的輸出結果進行分組,稱為partition。分組規則是按照公式:分組編号=key.hashCode/分組數。則每一個key-value對都會有一個分組編号。如果程式中未設定job.setNumReduceTask(預設為1),則該步驟省略。

(5)每次調用map計算所得到的結果将最終儲存到本地磁盤(非HDFS),為了降低與磁盤之間的IO讀寫,結果會先被儲存到記憶體緩沖區。當寫入資料達到該記憶體緩沖區門檻值時,則進行溢出操作,稱為spill。溢出的資料會先進行快速排序,然後形成一個臨時檔案儲存到磁盤中

 注:

     <1>該緩沖區被設定為100M。

     <2>關于溢出時機的問題,如果該緩沖區要到100M才溢出一次,則導緻後續寫入操作不得不等待。是以該記憶體緩沖區設定了“溢出比”這個概念,該記憶體緩沖區的溢出比為0.8,即當寫入資料達到80M時溢出一次,同時寫操作可以繼續執行。

     <3>記憶體緩沖區不斷進行寫入-->溢出-->寫入的操作,是以該緩沖區也被稱為環形緩沖區。

(6)當整個maptask結束後,hadoop先對溢出的臨時檔案進行合并(merge),然後進行堆排序(字典序),最後将處理後的檔案儲存到磁盤。

2.Reduce階段

步驟:

(1)将屬于自己分區的資料拉取并執行排序

(2)排序之後将key相同的key-value對調用reduce方法

(3)通過TextOutputFormat将結果寫入磁盤

注:後續将進一步完善,不喜勿噴,歡迎大神指點,謝謝。

繼續閱讀