如何编写YARN应用程序
1.???? 概述
YARN是一個資源管理系統,負責集群資源的管理和分配。如果想要將一個新的應用程序運行在YARN之上,通常需要編寫兩個組件:客戶端和ApplicationMaster。由于這兩個組件編寫非常復雜,尤其ApplicationMaster,需要考慮RPC調用、任務容錯等細節,所以,往往由專業的開發人員編寫這兩個組件,并提供給上層的應用程序用戶使用。如果大量應用程序可抽象成一種通用框架,那么只需實現一個客戶端和一個ApplicationMaster,然后讓所有應用程序重用這兩個組件即可,比如MapReduce是一種通用的計算框架,YARN已經為其實現了一個直接可以使用的客戶端—MRClientService和ApplicationMaster—MRAppMaster。
本文主要介紹了如何讓一種新的應用程序,或者新的計算框架,運行于YARN之上。正如前面介紹的,用戶需要編寫兩個組件完成該任務:客戶端和ApplicationMaster,其中,客戶端負責向ResourceManager提交ApplicationMaster,并查詢應用程序運行狀態,ApplicationMaster負責向ResourceManager申請資源(以Container形式表示),并與NodeManager通信以啟動各個Container,此外,ApplicationMaster還負責監控各個任務運行狀態,并在失敗是為其重新申請資源。
2.???? YARN Appcalition涉及到的RPC協議和主要編寫步驟
(1)?涉及到的RPC協議
通常而言,編寫一個YARN Appcalition涉及到3個RPC協議,分別為:
1)? ClientRMProtocol(Client<–>ResourceManager)
Client通過該協議將應用程序提交到ResourceManager上、查詢應用程序的運行狀態或者殺死應用程序等。
2)? AMRMProtocol(ApplicationMaster<–>ResourceManager)
ApplicationMaster使用該協議向ResourceManager注冊、申請資源以運行自己的各個任務。
3)? ContainerManager(ApplicationMaster<–> NodeManager)
ApplicationMaster使用該協議要求NodeManager啟動/撤銷Container,或者獲取各個container的運行狀態。
(2)客戶端編寫流程
步驟1?Client通過RPC函數ClientRMProtocol#getNewApplication從ResourceManager中獲取唯一的application ID
步驟2??Client通過RPC函數ClientRMProtocol#submitApplication將ApplicationMaster提交到ResourceManager上。
(3)ApplicationMaster編寫流程
步驟1?ApplicationMaster通過RPC函數AMRMProtocol#registerApplicationMaster向ResourceManager注冊。
步驟2?ApplicationMaster通過RPC函數AMRMProtocol#allocate向ResourceManager申請資源(以Container形式表示)。
步驟3?ApplicationMaster通過RPC函數ContainerManager#startContainer要求對應的NodeManager啟動Container。
ApplicationMaster重復步驟2~3,直到所有任務運行成功。
另外,在應用程序運行過程中,用戶可使用ClientRMProtocol#getApplicationReport 查詢應用程序運行狀態,也可以使用ClientRMProtocol#forceKillApplication將應用程序殺死。
3.?? 編寫YARN Appcalition詳細步驟介紹
(1)客戶端編寫流程
客戶端通常只需與ResourceManager交互,期間涉及到多個數據結構和一個RPC協議,具體如下:
步驟1?獲取ApplicationId。客戶端通過RPC協議ClientRMProtocol向ResourceManager發送應用程序提交請求GetNewApplicationRequest,ResourceManager為其返回應答GetNewApplicationResponse,該數據結構中包含多種信息,包括ApplicationId、可資源使用上限和下限等。
步驟2?提交ApplicationMaster。將啟動ApplicationMaster所需的所有信息打包到數據結構ApplicationSubmissionContext中,主要包括以下幾種信息:
(1)?application id
(2)?application 名稱
(3)?application優先級
(4)?application 所屬隊列
(5)?application 啟動用戶名
(6)??ApplicationMaster對應的Container信息,包括:啟動ApplicationMaster所需各種文件資源、jar包、環境變量、啟動命令、運行ApplicationMaster所需的資源(主要指內存)等。
客戶端調用ClientRMProtocol#submitApplication(ApplicationSubmissionContext)將ApplicationMaster提交到ResourceManager上。
(ResourceManager收到請求后,會為ApplicationMaster尋找合適的節點,并在該節點上啟動它)。
客戶端可通過多種方式查詢應用程序的運行狀態,其中一種是調用RPC函數ClientRMProtocol#getApplicationReport獲取一個應用程序當前運行狀況報告,該報告內容包括應用程序名稱、所屬用戶、所在隊列、ApplicationMaster所在節點、一些診斷信息、啟動時間等。
(2)編寫ApplicationMaster
ApplicationMaster需要與ResoureManager和NodeManager交互,以申請資源和啟動Container,期間涉及到多個數據結構和兩個RPC協議。具體步驟如下:
步驟1?注冊。ApplicationMaster首先需通過RPC協議AMRMProtocol向ResourceManager發送注冊請求RegisterApplicationMasterRequest,該數據結構中包含ApplicationMaster所在節點的host、RPC port和TrackingUrl等信息,而ResourceManager將返回RegisterApplicationMasterResponse,該數據結構中包含多種信息,包括該應用程序的ACL列表、可資源使用上限和下限等。
步驟2?申請資源。根據每個任務的資源需求,ApplicationMaster可向ResourceManager申請一系列用于運行任務的Container,ApplicationMaster使用ResourceRequest類描述每個Container(一個container只能運行一個任務):
1)??? Hostname??????? 期望Container所在的節點,如果是“*”,表示可以為任意節點。
2)??? Resource capability????????? 運行該任務所需的資源量,當前僅支持內存資源。
3)??? Priority???? 任務優先級。一個應用程序中的任務可能有多種優先級,ResourceManager會優先為高優先級的任務分配資源。
4)??? numContainers??????? 符合以上條件的container數目。
一旦為任務構造了Container后,ApplicationMaster會使用RPC函數AMRMProtocol#allocate向ResourceManager發送一個AllocateRequest對象,以請求分配這些Container,AllocateRequest中包含以下信息:
1)Requested containers????????????????? 所需的Container列表
2)Released containers??????????? 有些情況下,比如有些任務在某些節點上失敗過,則ApplicationMaster不想再在這些節點上運行任務,此時可要求釋放這些節點上的Container。
3)Progress update information????? 應用程序執行進度
4)ResponseId?????????????????? RPC響應ID,每次調用RPC,該值會加1。
ResourceManager會為ApplicationMaster返回一個AllocateResponse對象,該對象中主要信息包含在AMResponse中:
1)reboot????????? ???????? ApplicationMaster是否需要重新初始化.當ResourceManager端出現不一致狀態時,會要求對應的ApplicationMaster重新初始化。
2)Allocated Containers? 新分配的container列表。
3)Completed Containers??????? 已運行完成的container列表,該列表中包含運行成功和未成功的Container,ApplicationMaster可能需要重新運行那些未運行成功的Container。
ApplicationMaster會不斷追蹤已經獲取的container,且只有當需求發生變化時,才允許重新為Container申請資源。
步驟3?啟動Container。當ApplicationMaster(從ResourceManager端)收到新分配的Container列表后,會使用RPC函數ContainerManager#startContainer向對應的NodeManager發送ContainerLaunchContext以啟動Container,ContainerLaunchContext包含以下內容:
1)ContainerId?????????????????? Container id
2)Resource???? 該Container可使用的資源量(當前僅支持內存)
3)User??? Container所屬用戶
4)Security tokens?? 安全令牌,只有持有該令牌才可啟動container
5)LocalResource??? 運行Container所需的本地資源,比如jar包、二進制文件、其他外部文件等。
6)ServiceData???????? 應用程序可能使用其他外部服務,這些服務相關的數據通過該參數指定。
6)Environment??????? 啟動container所需的環境變量
7)command??? 啟動container的命令
ApplicationMaster會不斷重復步驟2~3,直到所有任務運行成功,此時,它會調用AMRMProtocol#finishApplicationMaster,以告訴ResourceManage自己運行結束。
【注意】 整個運行過程中,ApplicationMaster需通過心跳與ResourceManager保持聯系,這是因為,如果一段時間內(默認是10min),ResourceManager未收到ApplicationMaster信息,則認為它死掉了,會重新調度或者讓其失敗。通常而言,ApplicationMaster周期性調用RPC函數AMRMProtocol#allocate向其發送空的AllocateRequest請求即可。
4.?? 總結
編寫一個兼具高容錯性和高性能的ApplicationMaster是非常不容易的,在后面幾篇博文中,我將介紹YARN中提供的兩個ApplicationMaster實現,一個是非常簡單,通常用作示例的dsitributedshell,另一個是MapReduce計算框架對應的ApplicationMaster—MRAppMaster。
5.?? 參考資料
http://hadoop.apache.org/docs/r2.0.0-alpha/hadoop-yarn/hadoop-yarn-site/WritingYarnApplications.html
原創文章,轉載請注明:?轉載自董的博客
本文鏈接地址:?http://dongxicheng.org/mapreduce-nextgen/how-to-write-an-yarn-applicationmaster/
總結
以上是生活随笔為你收集整理的如何编写YARN应用程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop书籍和网络资源介绍
- 下一篇: Hadoop YARN安装部署初探