Yarn源码分析3-NodeManager剖析1
《Hadoop技术内幕-深入解析YARN架构设计与实现原理》学习笔记。 (Yarn源码基于Hadoop 3.0.0)
Yarn源码小组讨论班
2018-01-26
NM是单个计算节点的管理服务,它的主要功能包括:
- 与RM保持通信
- 管理Container生命周期
- 监控每个Container的资源使用情况
- 追踪节点健康状况
- 管理日志
- 管理不同应用用到的附属服务(auxiliary service)
1. 交互协议
主要包括两方面的内容:
- 与RM交互
- 与AM交互
1.1 与RM交互
NM通过ResourceTracker协议向RM进行RPC交互,其中NM是client角色,RM是server角色。
NM与RM的交互采用的是pull模型,即NM总是周期性的主动向RM发起请求并领取下发命令。
ResourceTracker协议提供了下面三个RPC函数:
1.1.1 RPC1 : registerNodeManager
NM启动时通过该RPC向RM进行注册,注册信息包括:
- nodeId, httpPort, resource, nmVersion, containerStatus, runningApplications, nodeLabels, physicalResource
RM会通过这个RPC调用返回如下信息:
- nodeToken的MasterKey
- containerToken的MasterKey
- nodeAction:要执行的动作,包括注册成功、重新同步信息、停止运行
- rmIdentifier:rm的标示符,在rm重启恢复或HA切换时,用来判断container来自原始的,还是新的rm
- diagnosticsMessage:在nm收到重新同步或停止运行的action时,会带上诊断信息
- rmVersion:rm版本
- resource:由RM读取本地文件dynamic-resources.xml中此节点的信息来指定此节点的资源容量
- areNodeLabelsAcceptedByRM:nodeLabels是否被RM接受
1.1.2 RPC2 : nodeHeartbeat
NM启动后,定期通过该RPC向RM汇报Container运行信息和节点健康状况,并领取来自RM的命令,比如杀死一个Container。后面再详细介绍。
1.1.3 RPC3 : unRegisterNodeManager
NM注销的接口,向RM发送nmId,然后RM执行相关清理工作。
1.2 与AM交互
NM通过ContainerManagementProtocol协议与应用的AM进行交互,其中NM是server角色,AM是client角色。
NM与AM之间的交互使用的是push模型,AM可以将Container相关的操作第一时间发给NM,大大降低了延迟。
ContainerManagementProtocol协议主要提供了以下RPC函数:
- startContainers:要求启动一批container
- stopContainers:要求停止一批container
- getContainerStatuses:获得NM上自己应用内的所有Container的状态
- increaseContainersResource:要求为containers增加资源
- updateContainer:为运行中的container更新资源
- signalToContainer:向Container发送一个信号,包括:OUTPUT_THREAD_DUMP、GRACEFUL_SHUTDOWN、FORCEFUL_SHUTDOWN
- localize:进行资源的本地化
- reInitializeContainer:使用新的ContainerLaunchContext来重启初始化container
- restartContainer:重启container
- rollbackLastReInitialization:回滚上次的reInitialize
- commitLastReInitialization:commit上次的reInitialize,一旦commit就不能回滚了
2. NM内部架构
NMContainerTokenSecretManager:
- 检查收到的各种访问Container请求的合法性,确保这些请求操作已经被RM授权
NMTokenSecretManagerInNM:
- NM的Token管理
ApplicationACLsManager:
- 确保用户请求的资源被RM授权过
ContainerExecutor:
- 可与底层操作系统交互,安全存放Container需要的文件和目录,进而以一种安全的方式启动和清除Container对应的进程。目前Yarn提供了DefaultContainerExecutor和LinuxContainerExecutor两种实现。
- DefaultContainerExecutor是默认实现,提供了一个通用的Container执行服务,未提供任何安全措施
- LinuxContainerExecutor则以应用程序拥有者的身份启动和停止Container,因此更加安全,此外,LinuxContainerExecutor允许用户通过Cgroups对CPU进行资源隔离,并且支持Docker
- 可与底层操作系统交互,安全存放Container需要的文件和目录,进而以一种安全的方式启动和清除Container对应的进程。目前Yarn提供了DefaultContainerExecutor和LinuxContainerExecutor两种实现。
DeletionService:
- 一个专门的文件删除服务异步删除失效文件,这样可避免同步删除带来的性能开销。
- 有一个delete.debug-delay-sec的参数可以控制任务结束之后文件的保留时间
AsyncDispatcher:NodeManager级别的异步的事件分发
- ContainerManagerEventType:由ContainerManagerImpl处理
- NodeManagerEventType:由NodeManager处理
LocalDirsHandlerService:
- 用来检查local-dirs和log-dirs的健康情况
- 健康是标准是有读、写、执行权限
NodeHealthCheckerService
- 通过周期性了进行一个自定义脚本检查节点的健康状态,并通过NodeStatusUpdater传递给RM。一旦RM发现一个节点处于不健康状态,则会将它加入黑名单,此后不再为它分配任务,直到再次转为健康状态。需要注意,加入黑名单后,正在运行的Container仍会正常运行,不会被杀死。
- 只需要配置脚本在被NM执行后在标准输出中打印ERROR开头的字符串即可被认为是unhealthy。
- 常用的功能包括:
- 可作为节点负载的反馈。由于目前只对CPU和内存进行了隔离,可以在磁盘、网络等资源紧张时设置为unhealthy
- 可作为人为暂时维护的方法。如果发现机器出现问题,可以人为控制该脚本,让NM暂时不接收新的任务
NodeLabelsProvider:提供了获取node label的接口,目前有两种实现:
- ConfigurationNodeLabelsProvider:通过定期读取配置文件来得到Label
- ScriptBasedNodeLabelsProvider:通过定期执行脚本来得到Label
NodeStatusUpdater:是NM与RM通信的唯一通道。当NM启动时,该模块向RM注册,之后周期性的进行通信。
- NM上报的信息是NodeHeartbeatRequest:
- Container CurrentKey: Container认证信息
- NM CurrentKey:NM认证信息
- nodeLabels:节点的lables
- registeringCollectors:收集应用信息,在timeline service v.2中使用
- nodeStatus:节点状态
- NodeHealthStatus:包括是否Heath,以及unhealth时的状态报告信息
- ContainerStatus:当前NM上Container的状态
- containersUtilization:Container声明的资源占用情况
- nodeUtilization:NM被声明的资源占用情况
- increasedContainers:获得自上次心跳以来,占用资源有所增长的Container
- NM上报的信息是NodeHeartbeatRequest:
(接上)NodeStatusUpdater:
- RM返回的信息是NodeHeartbeatResponse
- NodeAction:包括NORMAL, RESYNC, SHUTDOWN
- ContainersToCleanup:要清理的Containers
- ContainersToBeRemovedFromNM:要从NM中remove的Containers
- ApplicationsToCleanup:要清理的Application
- AppCollectors:告诉NM一些应用Collector的地址,为timeline service v.2提供数据
- ContainerTokenMasterKey:Container的认证信息
- NMTokenMasterKey:NM的认证信息
- ContainersToSignalList:要发信号的Container列表
- NextHeartBeatInterval:下一个心跳的间隔
- DiagnosticsMessage:诊断信息
- SystemCredentialsForApps:系统级别的证书(比如HDFS的Token),给资源本地化和日志收集使用
- AreNodeLabelsAcceptedByRM:节点的Label是否被RM接收了
- Resource:要更新的Resource的数量(在动态更新的情况下)
- ContainersToUpdate:需要更新的Container
- ContainerQueuingLimit:乐观的Container队列的等待长度和时间
- RM返回的信息是NodeHeartbeatResponse
ContainerManagerImpl:本身实现了ContainerManagementProtocol协议,负责与AM的通信。
- ResourceLocalizationService:负责Container所需求资源的本地化。能按照描述从HDFS上下载Container所需的文件资源,并尽量将它们分摊到各个磁盘上以防止出现访问热点。此外,它会为下载的文件添加访问控制限制,并为之施加合适的磁盘空间使用份额。
- ContainerLauncher:维护了一个线程池以并行完成Container相关操作,比如启动或者杀死Container,其中启动Container请求是由AM发起的,而杀死Container请求可能来自AM或RM
- ContainerScheduler:管理着运行时的Container,确保一个container只有在满足条件的情况下才能启动,并且确定在GUARANTEED container需要资源时,把OPPORTUNISTIC container杀死
- AuxServices:NM允许用户通过配置附属服务的方式扩展自己的功能,这样可以定制一些特定的框架需要的服务,这些服务由NM统一启动与关闭,典型的应用是MR中用的Shuffle HTTP Server
- ContainersMonitor:负责监控资源使用量。周期性探测运行中的资源利用量,一时超过上限,就发送信号杀掉,只有内存是通过监控方式来限制的,CPU是通过Cgroups限制的。
(接上)ContainerManagerImpl:
- LogHandler:一个可插拔组件,用户可通过它控制Container日志的保存方式,是写到本地磁盘还是将其打包上传到一个文件系统中
- SharedCacheUploadService:可以把本地的文件放到共享的cache中
- AMRMProxyService:用来监测和审查AM到RM的消息
- ContainerEventDispatcher:Container事件调度器,负责将ContainerEvent类型的事件调度给对应的Container的状态机
- ApplicationEventDispatcher:应用的事件调度器,负责将ApplicationEvent类型的事件调度给对应的Appplication状态机
- AsyncDispatcher:ContainerManager级别的异步事件分发器,其中:
- ContainerEventType:由ContainerEventDispatcher处理
- ApplicationEventType:由ApplicationEventDispatcher处理
- LocalizationEventType:由ResourceLocalizationService处理
- AuxServicesEventType:由AuxServices处理
- ContainersMonitorEventType:由ContainersMonitor处理
- ContainersLauncherEventType:由ContainerLauncher处理
- ContainerSchedulerEventType:由ContainerScheduler处理
NodeResourceMonitor:
- 用来监控机器资源的使用情况,用来给NodeStatusUpdater上报到RM
WebServer:
- 通过Web界面向用户展示该节点所有应用程序运行状态、Container列表、节点健康状态和Container产生的日志等信息
OpportunisticContainerAllocator:
- 可以利用节点上已分配但未真正使用的资源,原有Container类型定义为GUARANTEED类型,优先保证GUARANTEED类型的Container正常运行
JvmPauseMonitor:
- 一个简单的周期定时线程,如果启动时间明显比预期要长证明当前JVM或机器出现问题
NMCollectorService:
- 用来收集信息的服务,在timeline service v2打开时会启动