Yarn初探(一)资源调度
2013-03-29 by Leon资源调度器
YARN的资源管理器本质上像一个事件处理器,需要处理6种SchedulerEvent类型的事件:
- NODE_REMOVED:表示集群中被移除一个计算节点,资源调度器收到该事件时需要从可分配资源总量中移除相应的资源量。
- NODE_ADDED:表示集群中增加了一个计算节点,资源调度器收到该事件时需要将新增的资源量添加到可分配资源总量中。
- APPLICATION_ADDED:表示ResourceManager收到一个新的Application。资源管理器需将该Application添加到相应的数据结构中。通常,资源管理器需要为每个application维护一个独立的数据结构,以便于统一管理和资源分配。
- APPLICATION_REMOVED:事件APPLICATION_REMOVED表示一个Application运行结束,资源管理器需将该Application从相应的数据结构中清除。
- CONTAINER_EXPIRED:当资源调度器将一个container分配给某个ApplicationMaster后,如果该ApplicationMaster在一定时间间隔内没有使用该container,则资源调度器会对该container进行再分配。
- NODE_UPDATE:NodeManager通过心跳机制向ResourceManager汇报各个container运行情况,会触发一个NODE_UDDATE事件。
其中,NODE_UPDATE事件发生时表示可能有新的container得到释放,因此该事件会触发资源分配,该事件是6个事件中最重要的事件,它会触发资源调度器最核心的资源分配机制。
资源管理与分配
相比于MapReduce v1中的资源调度器,YARN采用了事件驱动的模型,因此编写起来更加复杂。同MapReduce v1一样,YARN也自带了三种常用的调度器,分别是FIFO,Capacity Scheduler和Fair Scheduler,其中,第一个是默认的调度器,它属于批处理调度器,而后两个属于多租户调度器,采用树形多队列的形式组织资源。
YARN的资源表示模型目前只支持CPU和内存的管理与分配,NodeManager启动时,会向ResourceManager注册,而注册信息中会包含该节点可分配的CPU和内存总量,YARN为了更细化的分配CPU资源,将物理CPU划分为多个虚拟CPU,用户提交应用程序时,可以指定每个任务需要的虚拟CPU个数。而对内存资源,YARN采用进程监控的方式控制内存,每个NodeManager会启动一个额外监控线程监控每个container内存资源使用量,一旦发现它超过约定的资源量,则会将其杀死。
YARN的资源分配模型是以队列的形式组织的,每个用户可属于一个或多个队列,且只能向这些队列中提交application。每个队列被划分了一定比例的资源。而资源分配过程是异步的,资源调度器将资源分配给一个application后,不会立刻push给对应的ApplicaitonMaster,而是暂时放到一个缓冲区中,等待ApplicationMaster通过周期性的RPC函数主动来取,即采用了pull-based模型,而不是push-based模型。
有关ApplictionMaster
ApplicationManager的三大模块:
-
AMLivelinessMonitor:周期性遍历所有ApplicationMaster,如果一个ApplicationMaster在一定时间内未汇报心跳信息,则认为它死掉了,它上面所有正在运行的Container将被置为运行失败,AM本身会被重新分配到另外一个节点上执行。
对于运行失败的Container, RM不会重新执行,它只会通过心跳机制告诉对应的AM,由AM决定是否重新执行,如果需要,则AM重新向RM申请资源。 - ApplicationMasterLauncher:处理AMLauncherEvent类型的事件,该类型事件有两种,分别是请求启动一个AM的“LAUNCH”和请求清理一个AM的“CLEANUP”。ApplicationMasterLauncher维护了一个线程池,从而能够尽快地处理这两种事件: - 收到了“LAUNCH”类型的事件,它会与对应的NodeManager通信,要求它启动ApplicationMaster。具体步骤如下: 1. 创建一个ContainerManager协议的Client; 2. 向对应的NodeManager发起连接请求; 3. 启动AM所需的各种信息,并封装成一个StartContainerRequest对象; 4. 通过RPC函数ContainerManager. startContainer()发送给对应的NM。 - 收到了“CLEANUP”类型的事件,它会与对应的NodeManager通信,要求它杀死ApplicationMaster。整个过程与启动AM的过程类似。
-
ApplicationMasterService:处理来自ApplicationMaster的请求:
- 注册
- 心跳
- 清理
其中,注册是ApplicationMaster启动时发生的行为,请求包中包含AM所在节点,RPC端口号和tracking URL等信息;心跳是周期性行为,包含请求资源的类型描述、待释放的Container列表等,而AMS则为之返回新分配的Container、失败的Container等信息;清理是应用程序运行结束时发生的行为,ApplicationMaster向RM发送清理应用程序的请求,以回收资源和清理各种数据结构。