这一篇博文是【大数据技术●降龙十八掌】系列文章的其中一篇,点击查看目录:大数据技术●降龙十八掌
NM是单个节点上的代理,功能包括与ResourceManager保持通讯、管理Container的生命周期、监控Container的资源使用、追踪节点健康状态、管理日志。
模块 | 说明 |
---|---|
NodeStatusUpdater | NodeStatusUpdater是NM和RM通讯的唯一通道。NM启动时,该组件负责向RM注册、汇报节点总的可用资源。该组件周期性地汇报各个Container的状态,接收RM返回的待清理的Container列表等。 |
ContainerManager | ContainerManager是NM最核心的模块。 |
RPC Server | 是AM和NM通讯的唯一通道,接收AM请求,启动或者停止Container |
ResourceLocalizationService | 负责Container所需资源的本地化,下载文件资源,尽量分摊到各个磁盘。 |
ContainersLauncher | 维护一个线程池并行操作Container。 |
AuxServices | NM附属服务。 |
ContainersMonitor | ContainersMonitor负责监控Container的资源使用量。 |
LogHandler | 用户可以通过LogHandler控制Container日志保存方式。 |
ContainerEventDispatcher | Container事件调度器,负责将ContainerEvent类型的事件调度给对应的Container的状态机 |
ApplicationEventDispatcher | Application事件调度器,负责将ApplicationEvent类型的事件调度给对应的Application状态机。 |
ContainerExecutor | ContainerExecutor可与底层操作系统交互,安全存放Container需要的文件和目录,启动和清除Container对应的进程。 |
NodeHealthCheckerServiceNodeHealthCheckerService通过周期性运行一个脚本和写磁盘检测节点的健康状况,并通知RM。NodeHealthScriptRunner:运行脚本检测LocalDirsHandlerService:写磁盘文件检测 | |
DeletionService | NM将文件删除功能化,DeletionService异步删除文件,避免同步删除文件带来的性能开销。 |
Security | 安全模块分为两部分:ApplicationACLManager确保访问NM的用户是合法的。ContainerTokenSecreManager确保用户请求的资源被RM授权过 |
WebServer | Web UI向用户展示 |
NodeManager自带了健康状况诊断机制,NM将自身健康状态报告给RM,RM根据NM健康状态动态分配任务数量。这个机制可以避免不必要的任务分配,还可以用于节点升级。
(1) 自定义脚本检测
NodeHealthScriptRunner服务主要用于周期性地执行节点健康检测脚本,这个脚本可以由管理员自定义,如果检测不健康,脚本要打印一条以ERROR开头的语句。
作用如下:
(2) 检测磁盘损坏数目
检测磁盘损坏数目可以通过参数yarn.nodemanager.disk-health-checker.enable设置是否启用,默认是启用的。LocalDirsHandlerService服务周期性的实现这个检测。
YARN中将用户应用程序执行时所需要的文件资源下载到各个节点上以便后续执行任务。分布式缓存不是将文件缓存到各个节点的内存而是磁盘,缓存资源的动作是用时触发。
NodeManager上的目录可以分为两种:数据目录和日志目录。
(1) 数据目录
数据目录用来存放执行Container所需的数据和运行过程中产生的临时数据,由参数yarn.nodemanager.local-dirs执行。
(2) 日志目录
日志目录则用于存放Container运行时输出日志,由参数yarn.nodemanager.log-dirs指定。
NodeManager维护着三类状态机,分别是Application、Container、LocalizedResource。
(1) Application状态机
RM上有一个整个集群上Application信息列表,而一个NM上也有一个处在它自己节点的Application的信息列表,NodeManager上的Application状态机维护着NodeManager上Application的状态。
这有利于对一个NM节点上的同一个Application所有的Container进行统一管理。
(2) Container状态机
Container状态机维护NodeManager上所有Container的生命周期。
(3) LocalizedResource状态机
LocalizedResource状态是NodeManager上用于维护一个资源生命周期的数据结构。资源包括文件、JAR包等。
NodeManager中的ContainerManager负责接收AM发来的请求以启动Container,Container的启动过程分三个阶段:资源本地化、启动并运行Container、资源清理。
(1) 资源本地化
资源本地化主要是进行分布是缓存工作,分为应用程序初始化和Container本地化。
(2) 运行Container
Container运行是由ContainerLauncher服务完成启动后,调用ContainerExecutor来进行的。主要流程为:将待运行的Container所需要的环境变量和运行命令写到Shell脚本launch_container.sh中,并将启动该脚本的命令写入default_container_executor.sh中,然后通过运行该脚本启动container。
(3) 资源清理
container清理是资源本地化的逆过程,是指当container运行完成后,NodeManager来回收资源。
资源隔离是指对不同的任务提供可独立使用的计算资源以避免他们相互干扰。
YARN对内存资源的隔离采用了两种可选方案:线程监控方案和基于轻量级资源隔离技术Cgroups的方案,默认情况下YARN采用的是进程监控方案来限制内存使用。
YARN对于CPU资源采用了Cgroups方案。
(1) Cgroups
Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组所使用的的物理资源的机制,物理资源包括:CPU、内存、IO等。
Cgroups提供了以下功能:
(2) 内存资源隔离
(3) CPU资源隔离