Map Task 與 Reduce Task
Map Task 可分解為Read,Map,Collect,Spill,Combine五個階段,將Reduce Task 分解為Shuffle,Merge,Sort,Reduce和Write五個階段。
在MapReduce計算框架中,一個應用程式被化成Map和Reduce兩個計算階段,它們分別由一個或者多個Map Task和Reduce Task組成。其中,每個Map Task處理輸入資料集合中的一片資料(split),產生若干資料片段,並將之寫到本地磁碟上,而Reduce Task 則從每個Map Task上遠端拷貝一個數據片段,經分組聚集和規約後,將結果寫到HDFS中。總體上看,Map Task與Reduce Task 之間的資料傳輸採用了pull模型。為了提高容錯性,Map Task將中間計算結果存放到本地磁碟上,而Reduce Task則通過Http協議從各個MapTask端拉取(pull)相應的待處理資料。為了更好地支援大量Reduce Task併發從Map Task端拷貝資料,Hadoop採用了Netty作為高效能網路伺服器。
對於map task而言,它的執行過程概述為:首先,通過使用者提交的inputformat將對應的inputsplit解析成一系列key/value,並依此交給使用者編寫的map()函式處理;接著按照指定的partitioner對資料分片,以確定每個key/value將交給哪個reduce task處理;之後將資料交給使用者定義的combiner進行一次本地規約(如果使用者沒有定義直接跳過);最後將處理結果儲存到本地磁碟上。
對於reduce task而言,由於它的輸入資料來自各個map task,因此首先需要通過http 請求從各個已經執行完成的map task上拷貝對應的資料分片,待所有資料拷貝完成後,在以key為關鍵字對所有資料進行排序,通過排序,key相同的記錄聚集到一起形成若干分組,然後將每組資料交給使用者編寫的reduce()函式處理,並將資料結果直接寫到hdfs上作為最終輸出結果。
1.Map Task詳細流程
1) Read階段:Map Task通過InputFormat,從split中解析出一系列<key,value>.
2) Map階段:將解析出的<key ,value>依次交給使用者編寫的map()函式處理,併產生一系列新的<key,value>
3) Collect階段:在map函式中,當資料處理完成後,一般會呼叫OutputCollector.collect()輸出結果,在該函式內部,它將<key,value>劃分成若干個資料分片(通過呼叫Partitioner),並寫入到一個環形記憶體緩衝區中。
4) Spill階段:即“溢寫”,當環形緩衝區滿後,MapReduce將資料寫到本地磁碟上,生成一個臨時檔案。需要注意的是,將資料寫入到本地磁碟之前,先要對資料進行一次本地排序,並在必要時對資料進行合併,壓縮等操作。
Map Task為何將處理結果寫入本地磁碟?該問題實際上波愛護兩層含義,即處理結果為何不寫入記憶體,或者直接傳送給Reduce Task?首先,Map Task不能講資料寫入記憶體,因為一個叢集中可能會同時執行多個作業,而每個作業坑你分多批執行Map Task,顯然,將結果直接寫入記憶體會耗光機器的記憶體;其次,MapReduce採用的是懂得排程策略,這意味著。一開始只有Map Task執行,而Reduce Task則處於未排程狀態,因此無法將MapTask計算結果直接傳送給Reduce Task。將Map Task 寫入本地磁碟,使得Reduce Task執行失敗時可直接從磁碟上再次讀取各個Map Task 的結果,而無需讓所有Map Task重新執行。總之,Map Task 將處理結果寫入本地磁碟主要目的是減少記憶體儲存壓力和容錯。
5)Combine節點:當所有資料處理完成後,Map Task對所有臨時檔案進行一次合併,以確保最終只會生成一個數據檔案。
每個Map Task為何最終只產生一個數據檔案?如果每個Map Task 產生多個數據檔案(比如每個Map Task為每個Reduce Task產出一個檔案),則會生成大量中間小檔案,這將大大降低檔案讀取效能,並嚴重影響系統擴充套件性(M個Map Task和R個Reduce Task可能產生M*R個小檔案)
2.Reduce Task 詳細流程
1)Shuffle階段:也稱為Copy階段,Reduce Task從各個Map Task上遠端拷貝一篇資料,並根據資料分片大小採取不同操作,如果其大小超過一定閥值,則寫到磁碟上,否則,直接放到記憶體。
2)Merge階段:在遠端拷貝資料的同時,Reduce Task啟動了兩個後端執行緒對記憶體和磁碟上的檔案進行合併,以防止記憶體使用量過多或磁碟上檔案資料過多
3)Sort階段:按照MapReduce語義,使用者編寫的reduce()函式輸入資料是按key進行聚集的一組資料。為了將key相同的資料聚在一起,Hadoop採用了基於排序的策略,由於各個Map Task已經實現對自己的處理結果進行了區域性排序,因此Reduce Task只需對所有資料進行一次歸併排序即可。
4)Reduce階段:在該階段中,Reduce Task將每組資料一次交給使用者編寫的reduce()函式處理
5)Write階段:將reduce()函式輸出結果寫到HDFS上