大資料之MapReduce瞭解及MapReduce Job提交到Yarn的工作流程
MapReduce主要用途是進行分散式計算
一、MapReduce理解
巨集觀上的理解: MapReduce僅僅是作為客戶端(Client)把程式碼程式提交到Yarn平臺上,MapReduce jar在Yarn上執行,屬於客戶端提交的過程,hdfs上傳的命令。
MapReduce指的是Map()和Reduce()函式,正常寫的程式碼是需要繼承它的,但是企業上進行生產一般是不會用它,但是它也至關重要,因為它是做大資料計算的第一批元件,後面的很多大資料開發或開源的計算元件很多的思想理念都是以MapReduce為核心的,比如Spark、Hive(解決了MapReduce的一些痛點問題)。
首先 Map()函式是:對映 -----元素在對映過程中會變成(key,value)鍵值的的結構,元素個數不變。 例如: ----------(key,value) x ------>(x,1) y ------>(y,1) Z ------>(z,1)
Reduce()函式:歸約 -----計算合併,元素個數必然變少,將對映的規則進行統計 例如 -------- (key,value) x ------>(x,1) x ------>(x,1) ------->(x,1+1+1) x ------>(x,1) y ------>(y,1) ------->(y,1)
當然,如果將SQL語句輸出的結果也如上所示形式,可以輸入這樣的語句: select key,sum(value) from t group by key x 3 y 1
如果是在mysql中想要輸出的結果的形式是(key,value)的形式,進行字串拼接: select CONCAT("(",col,“1”,")") as newcloumn from t; (x,1) (y,1) (z,1)
二、MapReduce架構
MapReduce沒有進行部署,所以沒有程序,但是為何會有架構呢? 其實作業提交到Yarn這個過程中,是很複雜的,不斷需要Yarn的ResourceManager和NodeManager之間進行資源排程和作業的提交,常常也可以說成是一種架構,如下圖所示: 一般,在面試過程中可能會被問到MapReduce Job提交到Yarn的工作流程?或者Yarn的架構設計?或者Yarn的工作流程?等等,實質上都是一個問題,也就是上圖的所示例的MapReduce Job提交到Yarn的工作流程:
圖文詳解:
這個過程一共是有8個步驟: 1、使用者向Yarn中的ResourceManager提交應用程式,其中包括ApplicationMaster程式,啟動ApplicationMaster命令、使用者命令等。
2、ResourceManager首先為該Application程式分配第一個Container容器,並與對應的Node Manager通訊,要求Node Manager在這個Container中啟動應用程式的MR ApplicationMaster。
3、ApplicationMaster首先向ApplicationsManager註冊,這樣使用者就可以通過ResourceManager web 8088檢視應用程式的執行狀態,然後它將為各個任務申請資源,並監控它的執行狀態,直到執行結束,即重複步驟4~7。
4、ApplicationMaster採用輪詢的方式通過RPC協議向Resource Scheduler申請和領取資源。
5、一旦ApplicationMaster申請到資源後,便與對應的Node Manager通訊,要求它啟動任務。
6、Node Manager節點為任務設定好執行環境(包括環境變數、JAR包、二進位制程式等)後,將任務啟動命令寫到一指令碼中,並通過執行該指令碼啟動container容器,執行task任務。
7.各個容器的任務,通過某個RPC協議向ApplicationMaster彙報自己的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的執行狀態,從而在任務失敗時重啟任務。在應用程式執行過程中,使用者可隨時通過RPC向ApplicationMaster通過web介面實時檢視應用程式的當前執行狀態。
8、應用程式執行完成後,ApplicationMaster向ResourceManager登出並關閉自己。
總結:
這個過程可以總結成2個階段: 當用戶向Yarn中提交一個應用程式後,Yarn將分為2個階段執行該應用程式: 1.第一階段是啟動ApplicationMaster 1-2 2.第二階段是由ApplicationMaster建立應用程式,為它申請資源,執行任務,並監控它的整個執行過程,直到執行完成,結束任務 3-8
需要注意的是:Reduce Task和Map Task是不會同時執行在同一個容器中,一個container只對應一個task或者一個ApplicationMaster。