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架构设计与实现原理》
转载:https://www.cnblogs.com/lemonu/p/13604482.html