Hadoop之mapreduce程式完整過程解析
阿新 • • 發佈:2018-11-10
今天在思考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向用戶反饋執行的結果資訊。