Yarn源码分析3-NodeManager剖析1

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
  • 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
  • (接上)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队列的等待长度和时间
  • 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打开时会启动