YARN也採用了Master/Slave結構,其中,Master實現爲ResourceManager,負責整個集羣資源的管理與調度;Slave實現爲NodeManager,負責單個節點的資源管理與任務啓動
ResourceManager是整個YARN集羣中最重要的組件之一,它的設計直接決定了系統的可擴展性、可用性和容錯性等特色,它的功能較多,包括ApplicationMaster管理(啓動、中止等)、NodeManager管理、Application管理、狀態機管理等
ResourceManager負責集羣中全部資源的統一管理和分配,它接收來自各個節點的資源彙報信息,並把這些信息按照必定的策略分配給各個應用程序
ResourceManager基本職能
ResourceManager需經過兩個RPC協議與NodeManager和AppMaster交互,具體以下 :
-
ResourceTracker : NodeManager經過該RPC協議向ResourceManager註冊、彙報節點健康情況和Container運行狀態,並領取ResourceManager下達的命令,這些命令包括從新初始化、清理Container等,在該RPC協議中,ResourceManager扮演RPCServer的角色,而NodeManager扮演RPCClient的角色,換句話說,NodeManager與ResourceManager之間採用了「pull模型」,NodeManager老是週期性地主動向ResourceManager發起請求,並經過領取下達給本身的命令
-
ApplicationMasterProtocol :應用程序的ApplicationMaster經過該RPC協議向ResourceManager註冊、申請資源和釋放資源。在該協議中,ApplicationMaster扮演RPC Client的角色,而ResourceManager扮演RPC Server的角色,換句話說,ResourceManager與ApplicationMaster之間採用了「pull模型」
-
ApplicationClientProtocol :應用程序的客戶端經過該RPC協議向ResouceManager提交應用程序、查詢應用程序狀態和控制應用程序等。在該協議中,應用程序客戶端扮演RPC Client的角色,而ResourceManager扮演RPC Server的角色
ResourceManager主要完成如下幾個功能 :
-
與客戶端交互,處理來自客戶端的請求
-
啓動和管理AppicationMaster,並在它運行失敗時從新啓動它
-
管理NodeManager,接收來自NodeManager的資源彙報信息,並向NodeManager下達管理指令
-
資源管理與調度,接收來自AppMaster的資源申請請求,併爲之分配資源
ResouceManager內部架構
ResourceManager主要由如下幾個部分組成 :
-
用戶交互模塊。ResourceManager分別針對普通用戶、管理員和Web提供了三種對外服務,具體實現分別對應ClientRMService、AdminService和WebApp
-
ClientRMService。ClientRMService是爲普通用戶提供的服務,它處理來自客戶端各類RPC請求,好比提交應用程序、終止應用程序、獲取應用程序運行狀態等
-
AdminService。ResourceManager爲管理員提供了一套獨立的服務接口,以防止大量的普通用戶請求使管理員發送的管理命令餓死,管理員可經過這些接口管理集羣,好比動態更新節點列表、更新ACL列表、更新隊列信息等
-
WebApp。爲了更加友好地展現集羣資源使用狀況和應用程序運行狀態等信息,YARN對外提供了一個WEB界面,這一部分是YARN仿照Haml開發的一個輕量級嵌入式Web框架
-
NM管理模塊。該模塊主要涉及如下組件 :
-
NMLivelinessMonitor。監控NM是否活着,若是一個NodeManager在必定時間內未彙報心跳信息,則認爲它死掉了,需將其從集羣中移除
-
NodesListManager。維護正常節點和異常節點列表,管理exclude(相似於黑名單)和include(相似於白名單)節點列表,這兩個列表均是在配置文件中設置的,能夠動態加載
-
ResourceTrackerService。處理來自NodeManager的請求,主要包括註冊和心跳兩種請求,其中,註冊時NodeManager啓動時發生的行爲,請求包中包含節點ID、可用的資源上限等信息;而心跳時週期性行爲,包含各個Container運行狀態,運行的Application列表、節點資源情況等信息,做爲請求的應答,ResourceTrackerService可爲NodeManager返回待釋放的Container列表、Application列表等信息
-
AM管理模塊。該模塊主要涉及如下組件 :
-
AMLivelinessMonitor。監控AM是否活着,若是一個ApplicationMaster在必定時間內未彙報心跳信息,則認爲它死掉了,它上面全部正在運行的Container將被置爲失敗狀態,而AM自己會被從新分配到另一個節點上執行
-
ApplicationMasterLauncher。與某個NodeManager通訊,要求它爲某個應用程序啓動ApplicationMaster
-
ApplicationMasterService。處理來自ApplicationMaster的請求,主要包括註冊和心跳兩種請求,其中,註冊是ApplicationMaster啓動時發生的行爲,註冊請求包中包含ApplicationMaster啓動節點;對外RPC端口號和trackingURL等信息;而心跳而是週期性行爲,彙報信息包含所需資源描述、待釋放的Container列表、黑名單列表等,而AMS則爲之返回新分配的Container、失敗的Container、待搶佔的Container列表等信息
-
Application管理模塊。該模塊主要涉及如下組件 :
-
ApplicationACLsManager。管理應用程序訪問權限,包含兩部分權限 :查看權限和修改權限。查看權限主要用於查看應用程序基本信息,而修改權限則主要用於修改應用程序優先級、殺死應用程序等
-
RMAppManager。管理應用程序的啓動和關閉
-
ContainerAllocationExpirer。當AM收到RM新分配的一個Container後,必須在必定的時間內在對應的NM上啓動該Container,不然RM將強制回收該Container,而一個已經分配的Container是否該被回收則是由ContainerAllocationExpirer決定和執行的
-
狀態機管理模塊。ResourceManager使用有限狀態機維護有狀態對象的生命週期,狀態機的引入使得YARN設計架構更加清晰。
ResourceManager共維護了四類狀態機,分別是RMApp、RMAppAttempt、RMContainer和RMNode
-
RMApp。RMApp維護了一個應用程序的整個運行週期,包括從啓動到運行結束整個過程。因爲一個Application的生命週期可能會啓動多個Application運行實例,所以可認爲,RMApp維護的是同一個Application啓動的全部運行實例的生命週期
-
RMAppAttempt。一個應用程序可能啓動多個實例,即一個實例運行失敗後,可能再次啓動一個從新運行,而每次啓動稱爲一個運行嘗試,用「RMAppAttempt」描述,RMAppAttempt維護了一次運行嘗試的整個生命週期
-
RMContainer。RMContainer維護了一個Container的運行週期,包括從建立到運行結束整個過程。RM將資源封裝成Container發送給應用程序的ApplicationMaster,而ApplicationMaster則會在Container描述的運行環境中啓動任務,所以,從這個層面上講,Container和任務的生命週期是一致的
-
RMNode。RMNode維護了一個NodeManager的生命週期,包括啓動到運行結束整個過程
-
安全管理模塊。ResourceManager自帶了很是全面的權限管理機制,主要由ClientTOAMSecretManager、ContainerTokenSecretManager、ApplicationTokenSecretManager等模塊完成
-
資源分配模塊。該模塊主要涉及一個組件 -- ResourceScheduler。ResourceScheduler是資源調度器,它按照必定的約束條件將集羣中的資源分配給各個應用程序,當前主要考慮內存和CPU資源。ResourceScheduler是一個插拔式模塊,YARN自帶了一個批處理資源調度器 -- FIFO和兩個多用戶調度器 -- Fair Scheduler和Capacity Scheduler
ResouceManager內部架構圖
我天天會寫文章記錄大數據技術學習之路,另外我本身整理了些大數據的學習資料,目前所有放在個人公衆號"SmallBird技術分享",加入咱們一塊兒學習交流,而且回覆'分享'會有大數據資源驚喜等着你~