【深入浅出 Yarn 架构与实现】6-1 NodeManager 功能概述
本节开始将对 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总体架构
【深入浅出 Yarn 架构与实现】6-1 NodeManager 功能概述的更多相关文章
- 【深入浅出 Yarn 架构与实现】4-1 ResourceManager 功能概述
前面几篇文章对 Yarn 基本架构.程序基础库.应用设计方法等进行了介绍.之后几篇将开始对 Yarn 核心组件进行剖析. ResourceManager(RM)是 Yarn 的核心管理服务,负责集群管 ...
- 【深入浅出 Yarn 架构与实现】3-1 Yarn Application 流程与编写方法
本篇学习 Yarn Application 编写方法,将带你更清楚的了解一个任务是如何提交到 Yarn ,在运行中的交互和任务停止的过程.通过了解整个任务的运行流程,帮你更好的理解 Yarn 运作方式 ...
- 【深入浅出 Yarn 架构与实现】4-4 RM 管理 Application
在 YARN 中,Application 是指应用程序,它可能启动多个运行实例,每个运行实例由 -个 ApplicationMaster 与一组该 ApplicationMaster 启动的任务组成, ...
- 【深入浅出 Yarn 架构与实现】4-3 RM 管理 NodeManager
本篇继续对 RM 中管理 NodeManager 的部分进行深入的讲解.主要有三个部分:检查 NM 是否存活:管理 NM 的黑白名单:响应 NM RPC 请求. 一.简介 在 RM 的主从结构中,最主 ...
- 【深入浅出 Yarn 架构与实现】1-1 设计理念与基本架构
一.Yarn 产生的背景 Hadoop2 之前是由 HDFS 和 MR 组成的,HDFS 负责存储,MR 负责计算. 一)MRv1 的问题 耦合度高:MR 中的 jobTracker 同时负责资源管理 ...
- 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境
本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...
- 【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC
RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑, ...
- 【深入浅出 Yarn 架构与实现】2-3 Yarn 基础库 - 服务库与事件库
一个庞大的分布式系统,各个组件间是如何协调工作的?组件是如何解耦的?线程运行如何更高效,减少阻塞带来的低效问题?本节将对 Yarn 的服务库和事件库进行介绍,看看 Yarn 是如何解决这些问题的. 一 ...
- 【深入浅出 Yarn 架构与实现】2-4 Yarn 基础库 - 状态机库
当一个服务拥有太多处理逻辑时,会导致代码结构异常的混乱,很难分辨一段逻辑是在哪个阶段发挥作用的. 这时就可以引入状态机模型,帮助代码结构变得清晰. 一.状态机库概述 一)简介 状态机由一组状态组成: ...
- 【深入浅出 Yarn 架构与实现】4-2 RM 管理 Application Master
上一篇文章对 ResourceManager 整体架构和功能进行了讲述.本篇将对 RM 中管理 Application Master 的部分进行深入的讲解. 下面将会介绍 RM 与 AM 整体通信执行 ...
随机推荐
- java图形化界面编程(AWT)
1.AWT编程简介 在JDK发布时,sun公司提供了一套基本的GUI类库,这个GUI类库希望可以在所有平台下都能运行,这套基本类库被称为"抽象窗口工具集",它为java应用程序提供 ...
- 新安装的eclipse没有新建java project----解决方法:安装插件
问题描述:最近新安装的一个eclipse版本,建立新工程的时候发现没有java project选项,如下: 百度了一些资料:https://blog.csdn.net/sinat_41752599/a ...
- Vue系列---【.npmrc文件设置私服地址】
一..npmrc 配置文件的优先级 电脑中有多个 .npmrc 文件,在我们安装包的时候,npm按照如下顺序读取这些配置文件 项目配置文件: /project/.npmrc 用户配置文件:~/.npm ...
- 使用SecureCRT通过SSH连接远程Linux设备
Ubuntu安装和配置ssh教程 https://blog.csdn.net/future_ai/article/details/81701744 以SecureCRT为例: 把电脑和设备连接在同一个 ...
- 20193314 白晨阳 实验三 Socket编程技术
学号 2019-2020-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 201933 姓名: 白晨阳 学号: 20193314 实验教师:王志 ...
- golang sync.RWMutex总结笔记
背景 最近项目中遇到两次RWMutex死锁问题,所以稍微看了一下资料和源码,稍作记录 源码 type RWMutex struct { w Mutex // held if there are pen ...
- matlab/simulink中的执行顺序问题
关于在simulink中开发一些硬件环境模型,有时候会碰到一些模块的执行先后顺序问题.比如说在一个通过UDP发送指令命令给客户端,要求发送的指令有先后的时间顺序,只有在前一条命令发送完以后,才可以进行 ...
- 【javascript】chormeV8源码阅读之 GC(垃圾回收)过程 笔记
1.为何需要垃圾回收 在V8引擎逐行执行JavaScript代码的过程中,当遇到函数的情况时,会为其创建一个函数执行上下文(Context)环境并添加到调用堆栈的栈顶,函数的作用域(handl ...
- 【前端样式】关于Element-plus 菜单 unique-opened不生效的问题
需要保证el-sub-menu 的唯一性,即index得写在el-sub-menu上,否则 unique-opened 属性不生效.
- MobaXterm注册认证版,亲测可用,操作简单(本机已安装python3环境)
去github地址下下载代码 解压后在该目录下打开CMD 执行MobaXterm-Keygen.py <UserName> <Version>命令 生成的文件放在安装目录下,我 ...