这是我参与「第四届青训营 」笔记创作活动的第10天
1. Resource Manager整体架构
-
ResourceManager需要进行集群里面所有任务的管理,所以在最上层这些模块里面负责管理的是任务里面所有的ApplicationMaster
-
ApplicationMasterService会定期的跟各个ApplicationMaster进行心跳的保持来进行资源请求的一些处理
-
AMLivelinessMonitor负责监控每一个ApplicationMaster是不是活着的,如果一个ApplicationMaster超过一定的时间段没有跟ApplicationMasterService发生心跳的关系,那就认为ApplicationMaster发生异常了,这时就会进行一些处理
-
ApplicationMasterLauncher主要负责进行ApplicationMaster的拉起
-
User Service主要负责让外部人员进行一些访问
-
Resource Scheduler主要负责当资源请求来了之后,按照一定的调度策略来对这些资源请求进行调度
-
State Machine 因为YARN里面是按照事件机制进行处理的,会维护几个重要对象的状态机,所以有了这些状态机之后,系统里边的请求和分配的操作就可以进行正常的流转
-
最下边这一层负责集群里所有节点的维护,每一个物理节点里边,都会部署一个NodeManager,NodeManager也需要定期的跟ResourceManager来进行心跳的交互
-
ResourceTrackerService负责心跳交互的模块,会相应各个NodeManager的心跳交互
-
NMLivelinessMonitor会定期的发现哪些节点没有及时的进行心跳,把这些节点处理掉,避免往这些节点上调度新的任务
-
NodesListManager主要会维护集群里面所有节点的状态信息
2. Resource Manager主要职责
ResourceManager负责集群所有资源的统一管理和分配,接收各节点汇报信息,并按照一定的策略分配给各个任务
- 与客户端交互
- 启动和管理所有的ApplicationMaster
- 管理所有的NodeManager
- 资源管理与调度
- 组织资源(资源池)
- 组织任务(队列)
- 接收资源请求
- 分配资源
3. Resource Manager状态机管理
3.1 RMApp状态机
在ResourceManager里面主要会维护4个重要对象的状态机,第一个是RMApp
-
RMApp就是当一个任务提交上来之后,ResourceManager内部就会维护这样一个对象,有了这个对象之后,就会进行各种状态的流转
-
从上图中看,图中有很多的状态,状态之间会通过一些事件来发生变化,这就是状态机
-
对于一个状态机来说,对于RMApp来说,它会有很多状态,比如说任务提交上来之后,它的状态就是NEW
-
当我们启动这个任务之后,就会从NEW状态转换为NEW_SAVING状态
-
在NEW_SAVING状态会进行一些数据的持久化操作,持久化操作完成之后,任务就会变成SUBMITTED状态,到SUNMITTED状态,就相当于数据已经提交到集群上了
-
到SUBMITTED状态会进行一些权限的校验,校验成功就会变成ACCEPTED状态,到ACCEPTED状态,就意味着任务已经提交到ResourceManager上,并且等待着ResourceManager为它分配资源
-
一旦任务得到资源分配并成功拉起之后,就会处于RUNNING状态
-
RUNNING状态运行完之后,就会根据一些状态来进行相应的转换,如果任务运行失败了,就会转换为FAILED状态,如果在运行期间被一些用户主动kill掉或一些其他的线程策略kill掉,任务就会变为KILLED状态,如果任务最终运行成功了,就会变为FINISHED状态
-
通过这样的流转,就会让RMApp能够正常的在这个系统里面运行
几个重要的状态:
-
NEW_SAVING:收到任务后,创建RMAppImpl对象并将基本信息持久化。为什么需要做这一步?假如任务刚提交上来以后,发生切主,这些信息如果没有持久化,这些任务可能就会丢失,等到切主完之后,这个任务可能就异常了
-
ACCEPTED:调度器接受该任务后所处的状态,任务等待被分配资源
-
RUNNING:任务成功获取到资源并在节点运行
3.2 RMAppAttempt
一个任务在运行的过程中,可能会启动多个实例,启动第一次实例的时候可能会失败,失败之后会执行重试的策略,再重新启动一个实例,对于每一个实例来说,就会有一个RMAppAttempt对象,对于一个RMApp,会管理下属的所有的RMAppAttempt这样的对象。
-
SCHEDULED:通过合法性检查后所处的状态,开始为该任务分配资源
-
ALLOCATED_SAVING:收到分配的Container后,在持久化完成前所处的状态
-
ALLOCATED:信息持久化完成后所处的状态
-
LAUNCHED:Resource Manager的ApplicationMasterLauncher与NodeManager通信以启动ApplicationMaster时所处的状态
3.3 RMContainer
-
RESERVED:开启资源预留时,当前节点不能满足资源请求时所处的状态
-
ALLOCATED:调度器分配一个Container给ApplicationMaster
-
ACQUIRED:Container被ApplicationMaster领走后的状态
-
EXPIRED:ApplicationMaster获取到Container后,若在一定时间内未启动Container,ResourceManager会强制回收该Container
3.4 RMNode
-
DECOMMISSIONED:节点下线后的状态
-
UNHEALTHY:节点处于不健康状态,健康检测脚本异常或磁盘故障
-
LOST:节点超过一定时间(默认10分钟)未与ResourceManager发生心跳后所处的状态