從業務的角度看,一個應用需要分兩部分進行開發,一個是接入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的核心作用就是分配資源、保證資源隔離。