最近在查YARN的一些问题,就总结一下YARN中RM的整体代码模块
一 ResourceManager的通信协议
- ApplicationClientProtocol : 客户端同ResourceManager之间的通信:提交,退出作业,获取作业信息,集群指标,队列信息,安全访问控制等
- ApplicationMasterProtocol : ApplicationMaster 同 ResourceManager 之间的通信:主要是am向rm注册,退出
- ContainerManagementProtocol : ApplicationMaster 和 nodemanager 之间的通信:停止container,获取container信息
- ResourceTracker : 向ResourceManager注册,退出,心跳等信息
- LocalizationProtocol : ContainerLocalizer 进程向 NM 报告资源下载进度
- TaskUmbilicalProtocol : MRChild 向 MRAppMaster 获取任务、报告进度等
- MRClientProtocol : client 向 ApplicationMaster获取作业信息 。 杀掉作业等
具体的图解
二 主要的职责
- 同客户端交互,处理客户端请求
- 启动和管理ApplicationMaster
- 管理NodeManager
2.1 客户端交互相关
- 普通用户:ClientRMService = 处理来自客户端的各种RPC请求,比如提交应用程序、终止应用程序、获取应用程序状态
- 管理员:AdminService = ResourceManager为管理员提供了一套独立的服务接口,以防止大量普通用户请求使管理员发送的管理命令饿死,管理员可通过这些接口管理集群,比如动态更新节点列表、更新ACL列表、更新队列信息等
- HTTP:WebApp = 为了更加友好地展示集群资源使用情况和应用程序运行状态等信息。YARN对外提供了一个Web界面
2.2 管理NodeManager
- RMNodeLabelsManager : 标签节点管理器
- NMLivelinessMonitor: 检测nm是否存活,检查参数 yarn.nm.liveness-monitor.expiry-interval-ms 默认600000
- NodesListManager : 维护正常节点和异常节点列表,管理exclude(类似于黑名单)和include(类似于白名单)节点列表,这两个列表均是在配置文件中设置的,可以动态加载
- ResourceTrackerService : 处理来自NodeManager的请求,主要包括注册和心跳两种,其中,注册是NodeManager启动时发生的行为,请求包中包含节点的ID、可用的资源上线等信息;而心跳是周期性行为,包括各个Container运行状态、运行的各个Application列表、节点健康状况(可通过一个脚本设置)等信息,作为请求的应答,ResourceTrackerService可为NodeManager返回待释放的Container列表、Application列表等信息。 默认端口是8031.
2.3 AM管理模块
在ApplicationMasterService和RMActiveServices两个服务中
ApplicationMasterService : 处理来自ApplicationMaster的请求,主要包括注册和心跳两种请求
AMLivelinessMonitor : AM的心跳超时处理。 具体又分为 amLivelinessMonitor 和 amFinishingMonitor
RMActiveServices中
ApplicationMasterLauncher : 与某个NodeManager通信,要求它为某个应用程序启动ApplicationMaster
2.4 Application管理模块
- ApplicationACLsManager : 管理应用程序访问权限,包含两部分权限:查看权限和修改权限。查看权限主要用于查看应用程序基本信息,而修改权限则主要用于修改应用程序优先级、杀死应用程序等
- RMStateStore: 作业会话管理,默认是MemoryRMStateStore ,需要的话设置yarn.resourcemanager.work-preserving-recovery.enabled ,可以通过 yarn.resourcemanager.store.class来调整。
- RMAppManager:管理应用程序的启动和关闭
- ContainerAllocationExpirer: 当AM收到RM新分配的一个Container后,必须在一定时间(默认为10min)内在对应的NM上启动该Container,否则RM将强制回收该Container,而一个已经分配的Container是否该被回收则是由ContainerAllocationExpirer决定和执行的
2.5 资源
- ResourceScheduler : 资源调度期 ,可以通过yarn.resourcemanager.scheduler.class 来设置,默认是org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler 。
- EventHandler : 调度事件的处理器 ,默认是SchedulerEventDispatcher 。这个调度处理器,注册了RMAppEventType,RMAppAttemptEventType,RMNodeEventType 三种事件类型
- QueueACLsManager : 队列权限控制
- SchedulingMonitor : 调度监控,yarn.resourcemanager.scheduler.monitor.enable 来控制是否开启,监控策略 yarn.resourcemanager.scheduler.monitor.policies来指定,目前已经存在的实现 org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy 。
2.6 事件处理器
Dispatcher : 全局的时间处理器,默认实现是 AsyncDispatcher 。 注册了NodesListManagerEventType,SchedulerEventType,RMAppEventType,RMAppAttemptEventType,RMNodeEventType,RMAppManagerEventType,AMLauncherEventType,RMFatalEventType
2.7 状态机管理模块
- RMApp: 维护一个作业的生命周期
- RMAppAttempt:维护一个试探性作业的生命周期
- RMContainer:维护一个Container的生命周期
- RMNode:维护一个NodeManager的生命周期
2.8 其他
ConfigurationProvider : 配置文件加载方式
各种的实现类都是加上Impl. 分别是
- RMAppImpl
- RMAppAttemptImpl
- RMContainerImpl
- RMNodeImpl
RMAppImpl的全部状态 RMAppState
- RMAPP_NEW
- RMAPP_NEW_SAVING
- RMAPP_SUBMITTED
- RMAPP_ACCEPTED
- RMAPP_RUNNING
- RMAPP_FINAL_SAVING
- RMAPP_FINISHING
- RMAPP_FINISHED
- RMAPP_FAILED
- RMAPP_KILLED
RMAppAttemptImpl的全部状态 RMAppAttemptState
- RMATTEMPT_NEW
- RMATTEMPT_SUBMITTED
- RMATTEMPT_SCHEDULED
- RMATTEMPT_ALLOCATED
- RMATTEMPT_LAUNCHED
- RMATTEMPT_FAILED
- RMATTEMPT_RUNNING
- RMATTEMPT_FINISHING
- RMATTEMPT_FINISHED
- RMATTEMPT_KILLED
- RMATTEMPT_ALLOCATED_SAVING
- RMATTEMPT_LAUNCHED_UNMANAGED_SAVING
- RMATTEMPT_RECOVERED
- RMATTEMPT_FINAL_SAVING
RMContainerImpl的全部状态RMContainerState
- NEW
- RESERVED
- ALLOCATED
- ACQUIRED
- RUNNING
- COMPLETED
- EXPIRED
- RELEASED
- KILLED
RMNodeImpl的全部状态 NodeState
- NEW
- RUNNING
- UNHEALTHY
- DECOMMISSIONED,
- LOST
- REBOOTED
- DECOMMISSIONING
- SHUTDOWN
0 条评论。