本節開始將對 Yarn 中的 NodeManager 服務進行剖析,
NodeManager 需要在每個計算節點上運行,與 ResourceManager 和 ApplicationMaster 進行互動,管理節點的計算資源以及調度容器,后續將對 NM 的功能職責、狀態機、容器生命周期和資源隔離等方面進行講解,本篇將從整體上對 NM 進行介紹,
一、NodeManager 基本職能
在 Hadoop 集群中,每個計算節點都需要有一個管理服務,其就是 NodeManager(NM),
它負責與 ResourceManager 保持通信,管理 Container 的生命周期,監控每個 Container 的資源使用情況,追蹤節點健康狀況,管理日志等,
主要職責:
- 保持與 ResourceManager 同步
- 跟蹤節點的健康狀況
- 管理節點各個 Container 的生命周期,監控每個 Container 的資源使用情況
- 管理分布式快取(對 Container 所需的 Jar,庫檔案的本地檔案系統快取)
- 管理各個 Container 生成日志
整體來說,NM 通過兩個 RPC 協議與 RM 和 AM 互動,如下圖所示,

一)與 RM 互動
通過 ResourceTrackerProtocol 協議:
- NM 通過該 RPC 協議向 RM 注冊、匯報節點健康狀況和 Container 運行狀態;
- 領取 RM 下達的命令,包括重新初始化、清理 Container 占用資源等,
在該協議中,RM 扮演 RPC server 的角色,而 NM 扮演 RPC Client 的角色(由內部組件 NodeStatusUpdater 實作),NM 與 RM 之間采用 「pull 模型」,NM 總是周期性地主動向 RM 發起請求,并領取下達給自己的命令,
二)與 AM 互動
通過 ContainerManagementProtocol 協議:
- 應用程式的 AM 通過該 RPC 協議向 NM 發起 Container 的相關操作(啟動、kill、獲取 Container 執行狀態等),
在該協議中,AM 扮演 RPC Client 的角色,而 NM 扮演 RPC Server 的角色(由內部組件 ContainerManager 實作),NM 與 AM 之間采用「push 模型」,AM 可以將 Container 相關操作的第一時間告訴 NM,相比于「pull 模型」,可以大大降低時間延遲,
二、NodeManager 內部結構
NodeManager 內部由多個組件構成,如下圖所示,其中最主要的三個組件是:NodeStatusUpdater、ContainerManager、NodeHealthCheckService,

一)NodeStatusUpdater
NodeStatusUpdater 是 NM 與 RM 通信的唯一通道,
- 當 NM 啟動時,該組件負責向 RM 注冊,并匯報節點上總的可用資源;
- 之后,該組件周期性與 RM 通信,匯報各個 Container 的狀態更新(包括節點上正在運行的 Container、已經完成的 Container 等資訊);
- 同時 RM 會回傳待清理的 Container 串列、待清理的應用程式串列、診斷資訊、各種 Token 等資訊,
二)ContainerManager
ContainerManager 是 NM 中最核心的組件之一,它由多個子組件組成,每個子組件負責一部分功能,協同管理運行在該節點上的所有 Container,各個子組件如下,
- RPC Server:該 RPC Server 實作了
ContainerManagementProtocol協議,是 AM 與 NM 通信的唯一通道,ContainerManager 從各個 AM 上接收 RPC 請求以啟動新的 Container 或者 停止正在運行的 Container,需要注意的是,任何 Container 操作均會經ContainerTokenSecretManager合法性驗證,以防止偽造啟動或停止 Container 的命令, - ResourceLocalizationService:負責 Container 所需資源的本地化,它能夠按照描述從 HDFS 上下載 Container 所需的檔案資源,并盡量將它們分攤到各個磁盤上以防止出現熱點訪問,此外,它會為下載的檔案添加訪問控制限制,并為之施加合適的磁盤空間使用份額,
- ContianersLauncher:維護了一個執行緒池以并行完成 Container 相關操作,比如啟動或者殺死 Container,其中啟動 Container 請求是由 AM 發起的,而殺死 Container 請求則可能來自 AM 或者 RM,
- AuxService:NodeManager 允許用戶通過配置附屬服務的方式擴展自己的功能,這使得每個節點可以定制一些特定框架的服務,附屬服務需要在 NodeManager 啟動之前配置好,并由 NodeManager 統一啟動與關閉,
- ContainersMonitor:ContainersMonitor 負責監控 Container 的資源使用量,為了實作資源隔離和公平共享,RM 為每個 Container 分配了一定量的資源,而 ContainersMonitor 周期性探測它在運行程序中的資源利用量,一旦發生 Container 超出了它的允許使用份額上線,就向 Container 發送信號將其殺掉,這可以避免資源密集型的 Container 影響同節點上其他正在運行的 Container,
- LogHandler:一個可插拔組件,用戶可通過它控制 Container 日志的保存方式,即是寫到本地磁盤上還是將其打包后上傳到一個檔案系統中,
- ContainerEventDispatcher:Container 事件調度器,負責將 ContainerEvent 型別的事件調度給對應 Container 的狀態機 ContainerImpl,
- ApplicationEventDispatcher:Application 事件調度器,負責將 ApplicationEvent 型別的事件調度給對應 Application 的狀態機 ApplicationImpl,
三)NodeHealthCheckerService
NodeHealthCheckerService 通過周期性地運行一個自定義腳本(由組件 NodeHealthScriptRunner 完成)和向磁盤寫檔案(由服務 LocalDirsHandlerService 完成)檢查節點的健康狀況,
并通過 NodeStatusUpdater 傳遞給 ResourceManager,一旦 ResourceManager 發現一個節點處于不健康狀態,則會將它加入黑名單,此后不再使用該資源,直到再次轉為健康狀態,需要注意的是,節點被加入黑名單時,正在運行的 Container 仍會正常運行,不會被殺死,
四)DeletionService
NodeManager 使用一個專門的服務用于檔案洗掉,異步地洗掉失效檔案,這樣可避免洗掉檔案帶來的性能開銷,
五)Security
安全部分,它包含兩部分,分別是 ApplicationACLsManager 和 ContainerTokenSecretManager,ApplicationACLsManager 確保訪問 NodeManager 的用戶是合法的,ContainerTokenSecretManager 確保用戶請求的資源被 ResourceManager 授權過,
- ApplicationACLsManager:NodeManager 需要為所有面向用戶的 API 提供安全檢查,如在 Web UI 上只能將 Container 日志顯示給授權用戶,該組件為每個應用程式維護了一個 ACL 串列,一旦收到類似請求后會利用該串列對其進行驗證,
- ContainerTokenSecretManager:檢查收到的各種訪問請求的合法性,確保這些請求操作已被 ResourceManager 授權,
六)WebServer
通過 Web 界面向用戶展示該節點上所有應用程式運行狀態、Container 串列、節點健康狀況和 Container 產生的日志等資訊,
七)ContainerExecutor
與底層作業系統互動,安全的放置 Container 所需要的檔案和目錄,隨后以一個安全的方式啟動和清理Container相關行程,
三、NodeManager 的事件與事件處理器
NodeManager主要組件也是通過事件進行互動的,這使得組件能夠異步并發完成各種功能,如下圖所示:


四、總結
本節對 NodeManager 整體結構進行了介紹,從它的基本職能、內部結構、事件處理三個方面進行講解,對 NM 整體結構有了認知,
實際上 NM 主要就負責兩個事情:1)與 RM 互動,注冊以及匯報狀態,領取 RM 指令處理 container,2)與 AM 互動,處理其管理的 container 操作,
參考文章:
《Hadoop技術內幕:深入決議YARN架構設計與實作原理》
深入YARN系列3:剖析NodeManager架構,組件與生產應用
NodeManager詳細組件及功能
Yarn NodeManager總體架構
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548783.html
標籤:其他
上一篇:scoket用法
下一篇:Java面向物件
