NodeManager專區-NodeManager的基本特性和概述

概述

       NodeManager是運行在單個節點上的代理,它需要與應用程序的ApplicationMaster和集羣的管理節點ResourceManager交互:從ApplicationMaster上接收有關的container的命令並執行;向ResourceMansger彙報各個container運行狀態和節點健康狀況,並領取有關container的命令執行

       NodeManager是yarn中單個節點上的代理,它管理hadoop集羣中單個計算節點,功能包括與ResourceManager保持通信、管理container和生命週期、監控每個container的資源使用情況、追蹤節點健康狀況、管理日誌和不同應用程序用到的附屬服務。

NodeManager職能

1、ResourceTrackerProtocol協議
       NodeManager通過該RPC協議向ResourceManager註冊、彙報節點健康狀況和container運行狀況,並領取ResourceManager下達的命令,包括重新初始化、清理container佔用資源等。在該RPC協議中,ResourceManager扮演RPC Server的角色,而NodeManager扮演PRC
client的角色,NodeManager總是週期性的主動向ResourceManager發送請求,並領取下達給自己的命令。ResourceTrackerProtocol協議主要提供了以下2個RPC函數

registerNodeManager
       NodeManager啓動時通過該RPC函數向ResourceManager註冊,註冊信息由register-NodeManagerRequest封裝的,包括3部分

  • httpPort: 該NodeManager對外提供的HTTP端口號,ResourceManager會在界面上提供一個可直接訪問NodeManager web界面的超鏈接
  • NodeId: 該NodeManager所在的host和對外的RPC端口號
  • totalResource: 該NodeManager所在節點總的可分配資源,當前支持內存和虛擬CPU兩種資源,管理員可通過參數yarn.nodemanager.resource.cpu-vcores和yarn.nodemanager.resource.memory-mb還可以通過參數yarn.nodemanager.vmem-pmem-ratio設置物理內存和虛擬內存使用比率,默認是2.1,即每使用1MB物理內存,最多可以使用2.1MB虛擬內存

       ResourceManager將還通過registerNodeManager函數向NodeManager返回一個Resister-NodeManagerResponse類型的對象,主要包含以下信息:

  • MasterKey: 新生成的container Token和Node Token的Master Key
  • NodeAction: ResourceManager向該NodeManager返回的下一步操作,主要包含NORMAL、RESYNC和SHUTDOWN三種,分別表示正常、重新同步信息和停止運行
  • rmIdentifier: ResourceManager的標識符。NodeManager通過該標識符判斷ApplicationMaster發送的container來自原始的還是新啓動的ResourceManager
  • diagnosticsMessage:NodeManager註冊失敗時,將收到一段診斷信息,告知具體的失敗原因

nodeHeartbeat
       NodeManager啓動後,定期通過該RPC函數向ResourceManager彙報container運行信息和節點健康狀況,並領取新的命令,比如殺死一個container

2、ContainerManagermentProtocol協議
        應用程序的ApplicationMaster通過該RPC協議向NodeManager發起針對Container的相關操作,包括啓動container、殺死container、獲取container執行狀態等。在該協議中,ApplicationMaster扮演RPC client的角色,而NodeManager扮演RPC server的角色,NodeManager與ApplicationMaster之間採用了Push模型,ApplicationMaster可以將container相關操作第一時間告訴NodeManager,相比Pull模型,可大大降低時間延遲,ContainerManagmentProtocol協議主要提供了三個RPC函數

  • startContainer: ApplicationMaster通過RPC要求NodeManager啓動一個container,該函數有一個startContainerRequest類型的參數,封裝了Container啓動所需的本地資源,資源變量、執行命令、Token等信息。如果Container啓動成功,則該函數返回一個StartContainerRequest對象
  • stopContainer: ApplicationMaster通過該RPC要求NodeManager停止(殺死)一個container。該函數有一個StopContainerRequest類型的參數,用於指定待殺死的ContainerID。如果Container被成功殺死,則該函數返回一個StopContainerRequest對象
  • getContainerStatus: ApplicationMaster通過該RPC獲取一個Container的運行狀態,該函數參數類型爲GetContainerStatusReuqest,封裝了目標Container的ID,返回值爲封裝了Container當前運行狀態的類型爲GetContainerStatusResponse的對象

NodeManager架構

  • NodeStatusUpdater: NodeStatusUpdater 是NodeManager與ResouceManager通信的唯一通道,當NodeManager啓動時,該組件負責向ResouceManager註冊,並彙報節點上總的可用資源,之後該組件週期性與ResouceManager通信,彙報各個container的狀態更新,包括節點上正運行的container,已完成的container等信息,同時ResouceManager會爲之返回待清理container列表、待清理應用程序列表、診斷信息、各種Token等信息
  • ContainerManager: ContainerManager是NodeManager中最核心組件之一,它由多個子組件構成,每個子組件負責一部分功能,協作共同管理運行在該節點上的所有container。 各個子組件如下
    • RPC Server: 該RPC Server實現了ContainerManagerProtocol協議,是ApplicationMaster與NodeManager通信的唯一通道,ContainerManager從各個ApplicationMaster上接收RPC請求以啓動新的Container或者停止正在運行的Container。需要注意的是,任何Container操作均會經ContainerTokenSecretManager合法性驗證,以防止ApplicationMaster僞造啓動或者停止Container命令
    • ResourceLocalizationService: 負責Container所需要資源的本地化,它能夠按照描述從HDFS上下載container所需額文件資源,並儘量將它們分攤到各個磁盤上以防止出現訪問熱點,此外,它會爲下載的文件添加訪問控制限制,併爲之施加合適的磁盤空間使用份額。
    • ContainersLauncher: 維護了一個線程池以並行完成Container相關操作,比如啓動或者殺死container,其中啓動Container請求是由ApplicationMaster發起的,而殺死Container請求則可能是來自ApplicationMaster或者ResourceManager。
    • AuxServiceS: NodeManager允許用戶通過配置附屬服務的方式擴展自己的功能,這使德每個節點可以定製一些特定框架需要的服務,當然,這些服務是與NodeManager上其他服務隔離開的,附屬服務需要在NodeManager啓動之前配置好,並有NodeManager統一啓動與關閉,典型的應用是MapReduce框架中用到的shuffle HTTP Server,其是通過封裝成一個附屬服務而有各個NodeManager啓動的
    • ContainersMonitor: ContainersMonitor負責監控Container的資源使用率,爲了實現資源隔離和公平共享,ResouceManager爲每個Container分配了一定量的資源,而ContainersMonitor週期性探測它在運行過程中的資源利用量,一旦發現Container超出了它的允許使用份額上限,就向Container發送信號將其殺掉,這可以避免資源密集型的container影響同節點上其他正在運行的container。在YARN中,只有內存資源是通過ContainerMonitor監控的方式加以限制的,對於CPU資源,則採用了輕量級資源隔離方案Cgroups
    • LogHandler: 一個可插撥組件,用戶可通過它控制container日誌保存方式,可以是寫本地磁盤上還是將其報告上傳到一個文件系統中。
    • ContainerEventDispatcher: Application事件調度器,負責將ContainerEvent類型的事件調度給對應Container的狀態機containerImpl
    • ApplicationEventDispatcher: application事件調度器,負責將ApplicationEvent類型的事件調度給對應Application的狀態機ApplicationImpl
  • ContainerExecutor: ContainerExecutor可與底層操作系統交互,安全存放container需要的文件和目錄,進而以一種安全的方式啓動或者清除container對應的進程,目前,YARN提供了DefaultContainerExecutor和LinuxContainerExecutor兩種實現。其中,DefaultContainerExecutor是默認實現,未提供任何權限安全措施,它以NodeManager啓動着的身份啓動和停止Container,而LinuxContainerExecutor則以應用程序擁有者的身份啓動和停止container,因此更加安全,此外linux-ContainerExector允許用戶通過Cgroup對CPU資源進行隔離
  • NodeHealthCheckerService: NodeHealthCheckerService通過週期性地運行一個自定義腳本和向磁盤寫文件檢查節點的健康狀況,並將之通過NodeStatusUpdater傳遞給ResourceManager,一旦ResourceManager發現一個節點處於不健康狀態,則會將它加入黑名單,此後不再爲它分配任務,直到再次轉爲健康狀態,需要注意的是,節點被加入黑名單後,正在運行的Container仍會正常運行,不會被殺死
  • DeletionService: NodeManager將文件刪除功能服務化,即提供一個專門的文件刪除服務異步刪除實效文件,這樣可避免同步刪除文件帶來的性能開銷
  • Security: 安全模塊是NodeManager中的一個重要模塊,它包含兩部分,分別是ApplicationACLsManager:確保訪問NodeManager的用戶是合法的,ContainerTokenSecrentManager:確保 用戶請求的資源被ResourceManager授權過,具體如下:
    • ApplicationACLsManager: NodeManager需要爲所有面向用戶的API提供安全檢查,如在Web UI上只能將Container日誌顯示給授權用戶,該組件爲每個應用程序維護了一個ACL列表,一旦收到類似請求後會利用該列表對其進行驗證
    • ContainerTokenSecretManager: 檢查收到的各種訪問請求是合法性,確保這些請求操作已被ResourceManager授權
  • WebServer: 通過Web界面向用戶展示該節點上所有應用程序運行狀態、container列表、節點健康狀況和container產生的日誌等信息。

NodeManager事件與事件處理器

       NodeManager中主要組件之間是通過事件進行交互的,這使得多個組件可異步併發完成各自的功能,總體上講,NodeManager中存在兩個中央異步調度器,分別位於NodeManager和ContainerManagerImpl中,它們內部均包含一些事件處理器,這些事件處理器處理的事件類型和事件傳遞方式如下表格。

組件名稱 事件處理器/服務 處理的事件類型 輸出事件類型
NodeStatusUpdater 服務 - ContainerManagerEventType
ContainerManager 事件處理器服務 ContainerManagerEvent ApplicationEventType、ContainerEventType
ResourceLocalizationService 事件處理器服務 LocalizationEvent ApplicationEventType、ResourceEventType、ContainerEventType
ContainersLauncher 事件處理器服務 ContainersLauncherEvent -
AuxServices 事件處理器服務 AuxServicesEvent -
ContainerMonitor 事件處理器服務 ContainerMonitorEvent ApplicationEventType、ContainerEventType
LogHandler 事件處理器服務 LogHandlerEvent ApplicationEventType
ContainerEventDispatcher 事件處理器 ContainerEvent -
ApplicationEventDispatcher 事件處理器 ApplicationEvent -
ContainerExecutor 服務 - ContainerEvent
NodeManager 事件處理器服務 NodeManagerEvent ContainerManagerEventType

NodeManager內部事件與事件處理器交互圖

更多內容關注公衆號"數據專場"
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章