YARN應用程序開發和設計流程


  從業務的角度看,一個應用需要分兩部分進行開發,一個是接入YARN平台,實現3個協議,通過YARN實現對集群資源的訪問和利用;另一個是業務功能的實現,這個與YARN本身沒有太大關系。下面主要闡述如何將一個應用接入YARN平台。

YARN開發流程包括Client和ApplicationMaster的開發。

         YARN主要由ResourceManager和NodeManager組成,ResourceManager負責資源的管理與分配,NodeManager則負責具體資源的隔離。YARN中,資源使用容器進行封裝。用戶在YARN上開發應用時,需要實現如下三個模塊:

  • Application Client: 應用客戶端用於將應用提交到YARN上,使應用運行在YARN上,同時,監控應用的運行狀態,控制應用的運行;

  • Application Master: AM負責整個應用的運行控制,包括向YARN注冊應用、申請資源、啟動容器等,應用的實際工作在容器中進行;

  • Application Worker: 應用的實際工作,並不是所有的應用都需要編寫worker。NodeManager啟動AM發送過來的容器,容器內部封裝了該應用worker運行所需的資源和啟動命令。

實現上述模塊,涉及如下3個RPC協議:

  • ApplicationClientProtocol: Client-RM之間的協議,主要用於應用的提交;

  • ApplicationMasterProtocol: AM-RM之間的協議,AM通過該協議向RM注冊並申請資源;

  • ContainerManagementProtocol: AM-NM之間的協議,AM通過該協議控制NM啟動容器。

   第一部分:Client的開發【主要作用是提交(部署)應用和監控應用運行兩個部分】

   客戶端設計流程(4個步驟)

步驟1:Client通過RPC函數ApplicationClientProtocol# getNewApplication從ResourceManager中獲取唯一的Application ID。

步驟2:Client通過RPC函數ApplicationClientProtocol# submitApplication【所有信息都封裝在這個參數里】將ApplicationMaster提交到ResourceManager上。
填充一定應用程序的信息:比如ApplicationMaster需要多少資源,ApplicationMaster運行jar包是什么,啟動命令是什么等等。

步驟3:RM根據ApplicationSubmissionContext上封裝的內容啟動AM。
步驟4:客戶端通過AM或RM獲取應用的運行狀態,並控制應用的運行過程。
    

第二部分:ApplicationMaster的編寫分兩步,每一步分三個步驟:
一、AM與RM交互【主要是來申請資源】
1、ApplicationMaster通過RPC函數ApplicationMasterProtocol# registerApplicationMaster向ResourceManager注冊;
【注冊的時候會告訴ResourceManager自己的ip端口】
【注冊完成后會返回一些信息:比如你這個Applicationmaster最多可以獲取多少資源,你的token是什么,】

2、ApplicationMaster通過RPC函數ApplicationMasterProtocol# allocate向ResourceManager申請資源(以Container形式表示);
【allocate是一個RPC函數,ApplicationMaster啟動后,已經知道內部有多少個task,每個task需要多少資源,會進行匯總,通過allocate向ResourceManager申請資源】
【allocate申請資源后,會周期性的調用allocate函數,第一:心跳,告訴Resourcemanager我還活着,第二:allocate每次調用后ResourceManager都會返回一些信息給你
比方說:你新申請到一些資源。 】
【你需要不斷的探測,有沒有得到新的資源】
【同時如果一些task死掉了,ResourceManager也會通過allocate告訴你】
【如果你不斷的申請資源,申請到資源之后呢,ApplicationMaster會與Nodemanageer通信來啟動對應的task】

3、ApplicationMaster通過RPC函數ApplicationMasterProtocol# finishApplicationMaster告訴ResourceManager應用程序執行完畢,並退出。
【不斷的申請資源,不斷的啟動task,最后所有的task都運行完了】
【這時候Resourcemanager就會把Applicationmaster的信息從內存中抹掉】
二、AM與NM交互 【主要是啟動容器、查詢容器狀態、停止容器,以下的第一和第二步是同時執行的】
1、ApplicationMaster將申請到的資源二次分配給內部的任務,並通過RPC函數ContainerManagementProtocol# startContainer與對應的NodeManager通信以啟動Container(【順便告訴NodeManager,這個Container,,,,,包含任務描述,資源描述等信息)
【比方拿到了1個cpu,1G內存,這里面有10個任務,到底分配給哪個任務呢,有一定的調度策略,這個也要由你實現,比方設計成隨便分配給某個任務,或者具有本地性的任務】

2、ApplicationMaster可通過RPC函數ContainerManagementProtocol#g etContainerStatus向NodeManager詢問Container運行狀態,一旦發現某個Container運行失敗【是有Applicationmaster發現,而不是Resourcemanager發現】,ApplicationMaster
可嘗試重新為對應的任務申請資源

3、一旦一個Container運行完成后,ApplicationMaster可以通過RPC函數ContainerManagementProtocol# stopContainer釋放Container

 

假設client和AppMaster已經開發完畢:
第一步 client內部會將依賴的jar包傳送到hdfs
第二步 將作業提交到ResourceManager
第三步:ResourceManager收到作業后啟動你所寫的ApplicationMaster,由你的main函數來執行,通信Resourcemanager申請資源,申請到資源后再跟nodemanager通信來啟動task。

  總得來說,YARN是一個資源管理平台,並不涉及業務邏輯,具體的業務邏輯需要用戶自己去實現。YARN的核心作用就是分配資源、保證資源隔離。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM