Yarn的基本执行流程之应用程序提交
- 客户端向RM提交应用,本质上是向RM请求启动AM
- RM进行分配NM,并要求NM启动AM
- NM收到启动AM的请求后,根据所携带的参数,下载AM所依赖的资源到本地
- 完成依赖资源的本地化后,NM启动AM进程
- AM启动后向RM进行注册,并向RM申请启动任务containr所需的资源
- RM根据NM的资源汇报情况,向AM回复资源(container)的分配情况,即给请求的任务container分配具体的NM。
- AM根据任务container分配的NM,向对应的NM发送请求,要求启动任务container
- NM收到启动任务container的请求后,同样根据请求参数,先完成依赖资源的本地化
- 然后启动任务container进程。
应用程序提交
客户端提交的流程
- 客户端向RM申请Application的ID
- RM内部生成application的唯一ID
- 通过rpc响应将applicaiton ID告知客户端
- 客户端携带ID,以及container上下文,通过RPC向RM提交任务。
Yarn Client(YarnClientImpl) 与 RM 进行 RPC 通信是通过 ClientRMService 服务实现的,应用程序提交到服务端,会调用 RMAppManager 类的对应方法来处理应用程序。
任务提交时在RM上的步骤
-
ClientRMService将请求转发给内部的AppManager。
-
AppManager创建一个App实例对象(RMAppImpl)。
-
随后向调度器发送
RMAppEventType.START
事件,触发处理方法RMAppNewlySavingTransition()
。 -
RMAppImpl收到事件后,向状态存储服务请求保存App状态,RMStateStoreState.ACTIVE–>RMStateStoreState.ACTIVE???,RMAppState状态从NEW变为NEW_SAVING。
-
状态存储服务完成APP信息的存储后,再以
RMAppEventType.APP_NEW_SAVED
事件的形式告知RMAppImpl,执行方法AddApplicationToSchedulerTransition()
-
RMAppImpl向调度器发送
AppAddedSchedulerEvent
的事件,由调度器进行处理,RMAppState状态从NEW_SAVING变为SUBMITTED。 -
调度器收到消息后,进行相应的处理动作,然后告知RMAppImpl应用被接受。
-
RMAppImpl创建Attempt实例对象(
RMAppAttemptImpl
) -
接着向其发送
RMAppAttemptEventType.START
事件,将RMAppAttemptState.NEW将变成RMAppAttemptState.SUBMITTED -
Attempt创建后,先向
ApplicationMasterService
进行注册,使其在内存中有对应的记录,方便后面真正的AM进程进行注册。 -
然后,向调度器发送
AppAttemptAddedSchedulerEvent
事件。 -
调度器同样进行一系列的处理,包括权限判断,队列应用计数等,在内存中记录相关信息,最后通知Attempt成功添加。
-
Attempt调用调度器的接口,申请启动AM所需的资源,同时RMAppAttemptState状态保持SUBMITTED。
此时客户端等待结束(提交成功)。等待NM RM心跳交互触发调度。RMAppState状态为ACCEPTED。RMAppAttemptState状态为SUBMITTED。
当RM和NM正常启动运行时,NM会与RM进行心跳交互,来进行消息交互和处理流程。