1. 程式人生 > >Hadoop之mapreduce程式完整過程解析

Hadoop之mapreduce程式完整過程解析

今天在思考mapreduce程式執行的過程時,發現對這塊有點亂,所以總結一下,hadoop下執行mapreduce程式的詳細過程··· ···

首先在執行一個mapreduce程式時,必須啟動相應的服務,也就是各個節點:

1.Hadoop中hdfs的兩個節點:NameNode、DataNode。

2.Hadoop中yarn的兩個節點:ResourceManager、NodeManager。

              各個節點的功能請參照我的另一篇部落格:

              https://blog.csdn.net/superme_yong/article/details/83004140 

3.Hadoop的歷史伺服器:JobHistoryServer(也可以不啟動,它實現了web檢視作業的歷史執行情況)。

            4個程序的啟動命令:
            sbin/hadoop-daemon.sh start namenode
            sbin/hadoop-daemon.sh start datenode
            sbin/yarn-daemon.sh start resourcemanager
            sbin/yarn-daemon.sh start nodemanager

            歷史伺服器啟動命令:mr-jobhistory-daemon.sh start historyserver
開始執行程式:

1.使用者先向jar包提交給yarn,yarn資源管理器向ResourceManager提交申請

2.ResourceManager接受請求,隨機選擇一臺NodeManager節點啟動AppMaster

3.AppMaster聯絡NodeManager啟動相關Task

4.NodeManager開始從指定位置拉取需要處理的資料,預設從hdfs中讀取資料,它讀取的檔案每一行轉成key    Value的形式(key:行偏移量、value:行內容)。

5.Map操作:

MapTask開始執行Map任務:

        每一行呼叫一次map方法:

              map 方法:對每一行資料進行處理、構建新的keyValue

              PS:這裡的map方法由你的業務決定.

6.shuffle操作:

       首先了解下什麼是shuffle:Shuffle描述著資料從map task輸出到reduce task輸入的這段過程。

所以shuffle的過程可以簡單的分為兩步:

一.Map端的shuffle:

當map執行完成後,資料會被輸入到一個環形緩衝區域,進行map端的shuffle過程,具體操作如下:

              注意:資料操作完成之後還在maptask中。

 分割槽:根據key的hash值對reduce個數取餘就是它的分割槽數。

 排序:相同分割槽的資料放在一起並按照字典排序

 溢寫:緩衝區的大小是有限的,當達到閾值80%開始溢寫到磁碟,生成多個小檔案

 合併:顯然小檔案不利於之後的操作,所以它會將所有的小檔案合併成一個大檔案

 排序:將所有小檔案中相同分割槽的資料放在一起並排序

         maptask執行完畢後會將執行結果通知給AppMaster,並銷燬自己。

二.Reduce端的shuffle:

當maptask執行結束後,AppMaster會通知ReduceTask,reducetask會從maptask端拉取屬於自己分割槽的資料,具體操作如下:

合併排序:將多個MapTask的結果進行合併並排序。

        分組:按照key的型別,將相同key的value放在一起 。

以wordcount為例:

<key(單詞),list<1,1,1>(將出現的次數放入集合中,以元素的方式儲存)>  

7.Reduce操作:

       reducetask開始執行reduce任務:

                對每一種key呼叫一次reduce方法:

                reduce方法:實現聚合或者其他操作、封裝新的keyValue

8當所有reduce方法結束後,reducetask會通知appmaster執行結果,並銷燬自己。

最後appmaster將執行的結果通知給ResourceManager,並登出自己,之後ResourceManager向用戶反饋執行的結果資訊。