MapReduce程式執行流程

_Karl發表於2018-06-12
為了方便理解,先用作圖的方式進行闡述:
        
MapReduce程式的執行過程分為兩個階段:Mapper階段和Reducer階段。
其中Mapper階段可以分為6個步驟:
第一階段:先將HDFS中的輸入檔案file按照一定的標準進行切片,預設切片的類為FileInputFormat,通過切片輸入檔案將會變成split1、split2、split3……;隨後對輸入切片split按照一定的規則解析成鍵值對<k1,v1>,預設處理的類為TextInputFormat。其中k1就是我們常說的起始偏移量,v1就是行文字的內容。
第二階段:呼叫自己編寫的map邏輯,將輸入的鍵值對<k1,v1>變成<k2,v2>。在這裡要注意:每一個鍵值對<k1,v1>都會呼叫一次map函式。
第三階段:按照一定的規則對輸出的鍵值對<k2,v2>進行分割槽:分割槽的規則是針對k2進行的,比如說k2如果是省份的話,那麼就可以按照不同的省份進行分割槽,同一個省份的k2劃分到一個區。注意:預設分割槽的類是HashPartitioner類,這個類預設只分為一個區,因此Reducer任務的數量預設也是1.
注意:如reduce要求得到的是全域性的結果,則不適合分割槽!
第四階段:對每個分割槽中的鍵值對進行排序。注意:所謂排序是針對k2進行的,v2是不參與排序的,如果要讓v2也參與排序,需要自定義排序的類,具體過程可以參看博主文章。
第五階段:排序完之後要進行分組,即相同key的value放到同一個集合當中,例如在WordCount程式中的<hello,{1,1}>執行的就是這個步驟,但是要注意:分組也是針對key進行的,經過分組完之後,就得到了我們熟悉的鍵值對<k2,v2s>.
第六階段(可選):對分組後的資料進行歸約處理。通過歸約處理鍵值對<k2,v2s>變成了<k2,v2>,經過這一階段,傳送到Reducer任務端的資料量會減少。但是規約的使用是有條件的,所以這一階段是可以選擇的。
上面的三四五:分割槽排序分組三個階段可以歸結為shuffle階段,在shuffle階段對鍵值對<k2,v2>處理後變成了<k2,v2s>.

Mapper任務處理完之後,就進入到了我們的Reducer階段:
Reducer任務的執行過程可以分為3個階段:
第一階段:對多個Mapper任務的輸出,按照不同的分割槽,通過網路拷貝到不同的Reducer節點上進行處理,將資料按照分割槽拷貝到不同的Reducer節點之後,對多個Mapper任務的輸出在進行合併,排序。例如:在WordCount程式中,若一個Mapper任務輸出了<hello,{1,1}>,另外一個Mapper任務的輸出為<hello,{1,1,1}>,經過在次合併之後變為<hello,{1,1,1,1,1}>.
第二階段:呼叫自己的reduce邏輯,將鍵值對<k2,v2s>變為<k3,v3>.在這裡注意:每一個鍵值對<k2,v2s>都會呼叫一次reduce函式。
第三階段:將Reducer任務的輸出儲存到指定的檔案中。
    經過上面的具體分析之後,我們在通過WordCount業務進行具體的說明,假設輸入檔案的內容為:

在這裡我們通過第一條記錄“helloyou”進行具體的說明MapReduce程式的執行過程,注:預設一個分割槽,整個過程處理如下:

到此,MapReduce程式的流程大致就講述完了,其實從巨集觀上來看,無非就是對鍵值的不斷處理。

相關文章