您好,登錄后才能下訂單哦!
本篇內容介紹了“YARN任務提交啟動的流程是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
【名詞概念】
首先來說明下yarn中的一些概念,后續流程中都會涉及到。
ResourceManager(RM)
負責整個集群的資源管理和分配,處理客戶端和AM的請求,為containr分配資源(將任務調度到不同的NM上運行),同時通過NM的心跳獲取所有container的運行狀態,并進行必要的失敗重試。
NodeManager(NM)
集群資源(CPU和內存,還包括GPU等)的實際擁有者,接收RM和AM的請求,啟動具體的container,并通過心跳向RM匯報container的運行情況。
Application
對應1.X版本中的job,它可以是一個MapReduce應用,也可以是一個spark應用,或者flink應用等。
ApplicationMaster(AM)
每個Application都有一個ApplicationMaster,負責管理具體的某個應用,包括向RM申請具體任務所需的資源,向NM請求啟動具體的任務,同時監控所有任務的運行狀況,并進行必要的容錯處理。spark的driver,flink的jobManager都屬于AM。
Container
Container是YARN中的一個抽象概念,它是任務運行所需資源,環境變量,啟動參數等的一個封裝和抽象。
一個Application中可以分為兩類Container,一類是前面提到的AM,一類是具體任務的container,常見的任務container有MR中的map任務、reduce任務、spark中的executor、flink的taskManager。
【整體流程】
首先通過一張圖來看下客戶端提交任務到最終運行的整體流程。
客戶端向RM提交應用,本質上是向RM請求啟動AM
RM選擇合適的NM,并向NM發送請求,要求啟動AM
NM收到啟動AM的請求后,根據所攜帶的參數,下載AM所依賴的資源到本地
完成依賴資源的本地化后,NM啟動AM進程
AM啟動后向RM進行注冊,并向RM申請啟動任務containr所需的資源
RM根據NM的資源匯報情況,向AM回復資源(container)的分配情況,即給請求的任務container分配具體的NM。
AM根據任務container分配的NM,向對應的NM發送請求,要求啟動任務container
NM收到啟動任務container的請求后,同樣根據請求參數,先完成依賴資源的本地化,然后啟動任務container進程。
整體流程中有幾點需要注意:
RM中為container分配container,是等待NM進行心跳匯報后,被動觸發進行的。
任務container的運行狀態,是NM通過心跳向RM匯報,RM再通過AM的心跳響應告知對應的AM。
【RM中的流程】
前面概念中提到了application、container以及AM。在RM中,分別用Application,Container,AppAttempt類來對應這三個概念。整個任務提交運行流程也就圍繞這三個類實例的創建,以及各自的狀態機變化完成。
當然,還有一塊內容未涉及,那就是調度器模塊,這里暫不深入,后續再單獨整理說明。
來看看任務提交運行在RM中的流程:
客戶端向RM申請Application的ID
RM內部生成application的唯一ID
通過rpc響應將applicaiton ID告知客戶端
客戶端攜帶ID,以及container上下文,通過RPC向RM提交任務。
RM的rpc服務將請求轉發給內部的AppManager模塊。
AppManager創建一個App實例對象(RMAppImpl)。
隨后向該實例對象發送start事件。
RMAppImpl收到事件后,向狀態存儲服務請求保存App狀態,狀態從NEW變為NEW_SAVING。
狀態存儲服務完成APP信息的存儲后,再以事件的形式告知RMAppImpl。
RMAppImpl向調度器發送添加APP的事件,狀態從NEW_SAVING變為SUBMITTED。
調度器收到消息后,進行相應的處理動作,然后告知RMAppImpl應用被接受。
RMAppImpl創建Attempt實例對象(RMAppAttemptImpl),
然后,向其發送start事件,隨后狀態從SUBMITTED變為ACCEPTED。
Attempt創建后,先向ApplicationMasterService進行注冊,使其在內存中有對應的記錄,方便后面真正的AM進程進行注冊。
然后,向調度器發送添加Attempt事件。
調度器同樣進行一系列的處理,包括權限判斷,隊列應用計數等,在內存中記錄相關信息,最后通知Attempt成功添加。
Attempt調用調度器的接口,申請啟動AM所需的資源,同時狀態從NEW變為SUBMITTED。
當有NM節點向RM發送心跳請求時,RM內部最終會以事件的形式通知到調度器,調度器則選擇合適的應用為其分配資源。
資源分配過程中,會新建Container對象(RMContainerImpl)。
然后向Container對象發送start事件。
container收到start事件后,告知attempt,資源已經完成分配。自身狀態從NEW切換為ALLOCATED。
attempt收到事件后,通過接口向調度器獲取已分配的資源,然后狀態從SUBMITTED切換為SCHEDULED。
調度器的接口處理過程中會向container發送acquire事件。Container的狀態從ALLOCATED切換為ACQUIRED。
隨后,attempt向狀態存儲模塊發送請求,要求存儲attempt的信息。自身狀態從SCHEDULED切換為ALLOCATED_SAVING。
狀態存儲完成后,以事件的形式告訴attempt。
attmpt向AMLaunch模塊發送啟動AM的請求。自身狀態從ALLOCATED_SAVING切換為ALLOCATED。
AMLaunch通過RPC協議向指定的NM發送startContainer的請求。
AMLaunch告知Attempt,container已啟動,Attempt的狀態從ALLOCATED切換為LAUNCHED。
NM收到請求后,啟動AM進程
AM進程啟動后向RM中的ApplicationMasterService進行注冊。
ApplicationMasterService收到注冊請求后,告知對應的Attempt。Attempt的狀態從LAUNCHED切為RUNNING。
Attempt收到AM進程并成功注冊的消息后,進而告訴RMAppImpl。App的狀態從ACCEPTED轉換為RUNNING。
注:NM通過心跳告知RM節點上container的運行狀態,RM內部處理該消息最終通知對應container,container狀態從ACQUIRED轉為RUNNING。
【NM中的流程】
與RM不同,在NM中并不感知container是具體任務還是AM,因此內部只有application和container,任務運行流程也就圍繞這兩個類實例的創建,狀態機的變化及周邊配套模塊完成。
在NM中,任務運行的流程如下圖所示:
NM內部的containerManagerImpl處理啟動container的請求,先新建一個AppImpl(App的具體實現,后面簡稱為App)的實例對象,然后向該APP發送一個初始化事件,然后新建一個ContainerImpl(Container的具體實現,后面簡稱為Container)對象。
App向日志聚合模塊發送請求,告知App啟動,要求進行相應的初始化動作,同時狀態從NEW變為INITING。
日志聚合模塊完成app的初始化動作后,通過事件告知App。
APP收到事件后,接著向資源本地化服務模塊發送請求,要求完成App所依賴資源的下載。
資源本地化服務模塊完成對應的資源下載后,通過事件告知App。
App收到事件后,向Container發送初始化事件,同時狀態從INITING變為RUNNING。
Container同樣向資源本地化服務模塊發送請求,要求完成Container所依賴資源的下載,此時狀態從NEW變為LOCALIZING。
資源本地化服務模塊每成功完成一個資源的下載,都會以事件的形式通知Container。
當Container感知所有依賴資源都完成本地化后,通過事件告知資源本地化服務模塊進行清理動作(這里的清理動作不是清理資源文件,而是結束相應的資源下載進程)。
Container繼續向Container啟動服務模塊發送請求,要求啟動具體的Container進程,隨后狀態從LOCALIZING變為LOCALIZED。
Container啟動服務模塊根據Container上下文,設置環境變量、啟動參數生成啟動腳本,并創建Container的進程,然后通過事件告知Container。
Container收到進程啟動的事件后,狀態從LOCALIZED變為RUNNING。
當Container的進程運行結束后,其對應的創建線程獲取其結束碼,并通知Container。(假設這里為運行成功并正常結束)
Container收到事件后,向資源本地化服務模塊發送請求,要求清理資源文件,然后狀態從RUNNING切換為EXITED_WITH_SUCCESS。
資源本地化服務模塊對Container的資源文件進行清理后,告知Container。
Container通知日志聚合模塊運行結束,讓其準備進行日志聚合。
隨后也通知App,Container運行結束,最后狀態切換為DONE。
App感知Container運行結束后,只是在內存中進行相關的記錄,NM通過心跳向RM上報所有container的運行狀況。RM會再通過心跳告知AM,當AM得知所有任務均結束時,向RM進行注銷,并自身退出。RM得知AM結束后,進行相應的處理動作,最終告知該應用對應任務containerd的NM,應用結束。NM內部最終告知App。
App收到消息后,通知資源本地化服務模塊進行資源的清理。然后自身狀態從RUNNING切換為APPLICATION_RESOURCE_CLEANUP。
資源化本地服務模塊完成資源清理后事件通知App。
App通知日志聚合模塊進行日志聚合,最后狀態變為FINISHED。
“YARN任務提交啟動的流程是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。