ApplicationMaster是Yarn任务执行过程中的一个重要角色,其启动过程中重要的机制和状态机变化如下图所示:
可以分为以下17个过程。
1.ClientRMService.submitApplication
客户端通过RPC接口——ApplicationClientProtocol.submitApplication——来提交任务,对应的RPC Server端在ResourceManager,由ClientRMService进行处理。
首先是用户提交任务,伪代码如下:
# 第一步:客户端创建Application
YarnClient.createApplication
// 客户端向ResourceManager申请Application,请求成功后applicationId已确认
ApplicationClientProtocol.getNewApplication(GetNewApplicationRequest)
// ResourceManager端为ClientRMService,调用接口为ClientRMService.getNewApplication
# 第二步:提交Application
YarnClient.submitApplication
// 提交任务到ResourceManager
ApplicationClientProtocol.submitApplication
// 最后通过调用ClientRMService.submitApplication进行处理
ClientRMService.submitApplication中,最重要的逻辑就是调用RMAppManager.submitApplication方法进行处理。
2.RMAppManager.submitApplication
这个方法最重要的逻辑就是:初始化RMApp,生成START事件。
伪代码逻辑如下:
ClientRMService.submitApplication
RMAppManager.submitApplication
RMAppImpl application = RMAppManager.createAndPopulateNewRMApp
发送事件new RMAppEvent(applicationId, RMAppEventType.START)
RMAppImpl是一个状态机,收到事件后,对事件进行处理。
.addTransition(RMAppState.NEW, RMAppState.NEW_SAVING,
RMAppEventType.START, new RMAppNewlySavingTransition())
RMAppImpl收到START事件后,对事件进行处理,处理逻辑定义在RMAppNewlySavingTransition.transition方法中。