Yarn NodeManager总体架构

Yarn NodeManager总体架构

NodeManager(NM)是 Yarn 中单个节点上的代理,它管理 Hadoop 集群中单个计算节点,功能包括与 ResourceManager 保持通信、管理 Container 的生命周期、监控每个 Container 的资源使用情况、追踪节点健康状况、管理日志和不同应用程序用到的附属服务(auxiliary service)

一、NodeManager 基本职能

整体上讲,NodeManager 需要通过两个 RPC 协议与 ResourceManager 服务和各个应用程序的 ApplicationMaster 交互,如下图所示。

NodeManager 相关 RPC 协议

ResourceTrackerProtocol 协议:NodeManager 通过该 RPC 协议向 ResourceManager 注册、汇报节点健康状况和 Container 运行状态,并领取 ResourceManager 下达的命令,包括重新初始化、清理 Container 占用资源等。在该协议中,ResourceManager 扮演 RPC server 的角色,而 NodeManager 扮演 RPC Client 的角色(由内部组件 NodeStatusUpdater 实现),换句话说,NodeManager 与 ResourceManager 之间采用 “pull 模型”,NodeManager 总是周期性地主动向 ResourceManager 发起请求,并领取下达给自己的命令。

ContainerManagementProtocol 协议:应用程序的 ApplicationMaster 通过该 RPC 协议向 NodeManager 发起针对 Container 的相关操作,包括启动 Container、杀死 Container、获取 Container 执行状态等。在该协议中,ApplicationMaster 扮演 RPC Client 的角色,而 NodeManager 扮演 RPC Server 的角色(由内部组件 ContainerManager 实现),换句话说,NodeManager 与 ApplicationMaster 之间采用了 “push 模型”,ApplicationMaster 可以将 Container 相关操作的第一时间告诉 NodeManager,相比于 “pull 模型”,可以大大降低时间延迟。

二、NodeManager 内部结构

这部分主要深入介绍 NodeManager 内部组织结构和主要模块,如下图:

NodeManager 内部结构

NodeStatusUpdate:NodeStatusUpdater 是 NodeManager 与 ResourceManager 通信的唯一通道。当 NodeManager 启动是,该组件负责向 ResourceManager 注册,并汇报节点上总的可用资源。之后,该组件周期性与 ResourceManager 通信,汇报各个 Container 的状态更新,包括节点上正在运行的 Container、已经完成的 Container 等信息,同时 ResourceManager 会为之返回待清理的 Container 列表、待清理的应用程序列表、诊断信息、各种 Token 等信息。

ContainerManager:ContainerManager 是 NodeManager 中最核心的组件之一,它由多个子组件组成,每个子组件负责一部分功能,协同管理运行在该节点上的所有 Container,各个子组件如下:

RPC Server:该 RPC Server 实现了 ContainerManagementProtocol 协议,是 ApplicationMaster 与 NodeManager 通信的唯一通道。ContainerManager 从各个 ApplicationMaster 上接收 RPC 请求以启动新的 Container 或者挺直正在运行的 Container。需要注意的是,任何 Container 操作均会经 ContainerTokenSecretManager 合法性验证,以防止 ApplicationMaster 伪造启动或停止 Container 的命令。

ResourceLocalizationService:负责 Container 所需资源的本地化,它能够按照描述从 HDFS 上下载 Container 所需的文件资源,并尽量将它们分摊到各个磁盘上以防止出现热点访问。此外,它会为下载的文件添加访问控制限制,并为之施加合适的磁盘空间使用份额。

ContianersLauncher:维护了一个线程池以并行完成 Container 相关操作,比如启动或者杀死 Container,其中启动 Container 请求是由 ApplicationMaster 发起的,而杀死 Container 请求则可能来自 ApplicationMaster 或者 ResourceManager。

AuxService:NodeManager 允许用户通过配置附属服务的方式扩展自己的功能,这使得每个节点可以定制一些特定框架的服务。附属服务需要在 NodeManager 启动之前配置好,并由 NodeManager 统一启动与关闭。

ContainersMonitor:ContainersMonitor 负责监控 Container 的资源使用量,为了实现资源隔离和公平共享,ResourceManager 为每个 Container 分配了一定量的资源。而 ContainersMonitor 周期性探测它在运行过程中的资源利用量,一旦发生 Container 超出了它的允许使用份额上线,就向 Container 发送信号将其杀掉,这可以避免资源密集型的 Container 影响同节点上其他正在运行的 Container。

LogHandler:一个可插拔组件,用户可通过它控制 Container 日志的保存方式,即是写到本地磁盘上还是将其打包后上传到一个文件系统中。

ContainerEventDispatcher:Container 事件调度器,负责将 ContainerEvent 类型的事件调度给对应 Container 的状态机 ContainerImpl。

ApplicationEventDispatcher:Application 事件调度器,负责将 ApplicationEvent 类型的事件调度给对应 Application 的状态机 ApplicationImpl。

ContainerExecutor:ContainerExecutor 可与底层操作系统交互,安全存放 Container 需要的文件和目录,进而以一种安全的方式启动和清除 Container 对应的进程。目前 Yarn 提供了 DefaultContainerExecutor、LinuxContainerExecutor 和 DockerContainerExecutor 三种实现。

NodeHealthCheckerService:NodeHealthCheckerService 通过周期性地运行一个自定义脚本(由组件 NodeHealthScriptRunner 完成)和向磁盘写文件(由服务 LocalDirsHandlerService 完成)检查节点的健康状况,并将之通过 NodeStatusUpdater 传递给 ResourceManager。一旦 ResourceManager 发现一个节点处于不健康状态,则会将它加入黑名单,此后不再为它分配资源,直到再次转为健康状态。需要注意的是,节点被加入黑名单时,正在运行的 Container 仍会正常运行,不会被杀死。

DeletionService:NodeManager 将文件删除功能服务化,即提供一个专门的文件删除服务,异步删除失效文件,这样可避免删除文件带来的性能开销。

Security:安全模块是 NodeManager 中的一个重要模块,它包含两部分,分别是 ApplicationACLsManager 和 ContainerTokenSecretManager,ApplicationACLsManager 确保访问 NodeManager 的用户是合法的,ContainerTokenSecretManager 确保用户请求的资源被 ResourceManager 授权过。具体如下:

ApplicationACLsManager:NodeManager 需要为所有面向用户的 API 提供安全检查,如在 Web UI 上只能将 Container 日志显示给授权用户。该组件为每个应用程序维护了一个 ACL 列表,一旦收到类似请求后会利用该列表对其进行验证。

ContainerTokenSecretManager:检查收到的各种访问请求的合法性,确保这些请求操作已被 ResourceManager 授权。

WebServer:通过 Web 界面向用户展示该节点上所有应用程序运行状态、Container 列表、节点健康状况和 Container 产生的日志等信息。

【参考资料】

董西成.《Hadoop技术内幕:深入解析YARN架构设计与实现原理》

相关推荐

ColorOS15怎么更新
365bet线上

ColorOS15怎么更新

📅 07-22 👁️ 8224
“应用程序已停止”:如何修复
www.bet3365.com

“应用程序已停止”:如何修复

📅 08-22 👁️ 4534