Resource Manager | 青训营笔记

98 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第10天

1. Resource Manager整体架构

image.png

  • 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状态机

image.png

在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

image.png

一个任务在运行的过程中,可能会启动多个实例,启动第一次实例的时候可能会失败,失败之后会执行重试的策略,再重新启动一个实例,对于每一个实例来说,就会有一个RMAppAttempt对象,对于一个RMApp,会管理下属的所有的RMAppAttempt这样的对象。

  • SCHEDULED:通过合法性检查后所处的状态,开始为该任务分配资源

  • ALLOCATED_SAVING:收到分配的Container后,在持久化完成前所处的状态

  • ALLOCATED:信息持久化完成后所处的状态

  • LAUNCHED:Resource Manager的ApplicationMasterLauncher与NodeManager通信以启动ApplicationMaster时所处的状态

3.3 RMContainer

image.png

  • RESERVED:开启资源预留时,当前节点不能满足资源请求时所处的状态

  • ALLOCATED:调度器分配一个Container给ApplicationMaster

  • ACQUIRED:Container被ApplicationMaster领走后的状态

  • EXPIRED:ApplicationMaster获取到Container后,若在一定时间内未启动Container,ResourceManager会强制回收该Container

3.4 RMNode

image.png

  • DECOMMISSIONED:节点下线后的状态

  • UNHEALTHY:节点处于不健康状态,健康检测脚本异常或磁盘故障

  • LOST:节点超过一定时间(默认10分钟)未与ResourceManager发生心跳后所处的状态