一個mapreduce作業,一般分爲兩階段執行:map階段和reduce階段,下面分別對這兩階段進行介紹。
Map階段
Map階段又分爲五部分:讀取文件階段,MapTask階段,collect階段,溢寫階段,combine階段。
首先客戶端把待處理文件分片信息、jar包信息、參數信息等提交到HDFS。然後Yarn集羣接受任務,啓動AppMaster把任務分配NodeManager,並由NodeManager執行MapTask任務。從上圖的第6步開始,進入讀取文件階段。
- 讀取文件階段
MapTask通過用戶編寫的RecordReader,從輸入的分片中解析出一個個的k-v對; - MapTask階段
每個k-v對調用一次map()函數,輸出新的k-v對; - Collect階段
MapTask階段輸出的k-v對會先進入環形緩衝區,默認內存大小爲100M。在環形緩衝區中,數據進行分區、排序等; - 溢寫階段
當環形緩衝區寫滿80%,數據從內存溢寫到hdfs,持續多輪以後會產生多個溢寫文件。溢寫之前,數據會先按分區,再按key排序; - Combine階段
當MapTask結束時,多個溢寫文件會被合併成一個大的文件。Combine可以把文件中的k-v對數據排列的更緊密一些,減少網絡傳輸I/O。
Reduce階段
Reduce階段分爲四部分:Copy階段、Merge階段、sort階段、Reduce階段
- Copy階段
ReduceTask從各個MapTask上遠程拷貝一片數據,如果其大小超過一定閾值,則寫到磁盤上,否則直接放到內存中; - Merge階段
遠程拷貝文件的同時,ReduceTask啓動兩個後臺線程對內存和磁盤上的文件進行合併,以防止內存使用過多或磁盤上文件過多; - sort階段
爲了將key相同的數據聚在一起,Hadoop採用了基於排序的策略。由於各個MapTask已經實現了對自己處理結果的局部排序,此步中只需對所有數據進行一次歸併排序; - Reduce階段
以上步驟處理後的數據調用reduce()函數,每個k-v調用一次。最後把輸出文件寫到HDFS中。
以上就是對MapReduce工作機制的簡單說明,如有錯誤的地方,還望指正。