AM在NM上启动成功并向RM注册后,向RM请求资源(Container),该过程有以下两个阶段迭代循环:
阶段1:AM汇报资源需求,并领取已经分配到的资源。
阶段2:NM向RM汇报各个Container的运行状态,如果RM发现它上面有空闲的资源,则进行一次资源分配,并将分配的资源保存到对应的数据结构中,等待下一次AM发来心跳信息是获取(即阶段1)。
Container分配与申请流程的具体步骤如下。
(1) 阶段1
步骤1. AM通过RPC函数ApplicationMasterProtocol#allocate向RM汇报资源请求(被周期性调用,也是AM的心跳),包括新的资源需求的描述,待释放的Container列表,请求加入黑名单的节点列表,请求移除黑名单的节点列表。
步骤2. RM的ApplicationMasterService负责处理来自AM的请求,一旦收到该请求,会向RMAttemptImpl发送RMAppAttemptEventType事件(STATUS_UPDATE)。RMAttemptImpl收到事件后,将跟新应用程序执行进度和AMLivenessMonitor的中的应用程序最近更新时间。
步骤3. ApplicationMasterService会调用RrsourceScheduler#allocate,将AM的资源需求汇报给ResourceSchedular。
步骤4. ResourceSchedular首先读取待释放的Container列表,依次向对应的RMContainerImpl发送RMContainerEvent事件(RELEASED),以杀死正在运行的Container(这个过程中会发送RMNodeCleanContainerEvent事件(CLEANUP_CONTAINER)给RMNodeImpl,RMNodeImpl把待释放Container放入释放集合)。然后分配资源,放入对应的数据结构并返回给应用程序。
(2) 阶段2
步骤1. NM通过RPC方法ResourceTracker#nodeHeartbeat向RM汇报各个Container的运行状态。
步骤2. RM的ResourceTrackerService处理这个请求,经过一系列检查,向RMNodeImpl发送RMNodeStatusEvent事件(STATUS_UPDATE)。RMNodeImpl收到事件后,将会更新各个Container的状态,并向ResourceScheduler发送SchedulerEventType事件(NODE_UPDATE)。
步骤3. ResourceScheduler收到后,如果该节点上有可分配的空闲资源,则会将资源分配给应用程序,分配后的资源仅仅是记录到对应的数据结构中,等待AM下次心跳来取。
![](https://i-blog.csdnimg.cn/blog_migrate/d96a38fd52df2d30f36404fff1caa0e6.png)