Overview
在hadoop中,很多资源的任务的实现都是用FSM来实现的,这里,用RMApp的实现来分析一下,Hadoop FSM。
下图展示了,Hadoo 中RMApp的状态机变化:
图 1-1
下面再来看一下,每个事件是什么时候触发,当事件发生的时候,又做了什么!完整的状态机在 Classloader 将RMAppImpl load 到JVM中就建立来, 初始的状态,NEW 在RMAppImpl 对像初始化的时候,建立,这是由ApplicationManager初始化的。
// Create RMApp
application =
new RMAppImpl(applicationId, rmContext, this.conf,
submissionContext.getApplicationName(),
submissionContext.getAMContainerSpec().getUser(),
submissionContext.getQueue(),
submissionContext, this.scheduler, this.masterService,
submitTime);
在RMAppimpl的构造方法中:
this.stateMachine = stateMachinFactory.make(this);
创建了App 状态机;
START handle
当客户端提交一个SubmitApplicationRequest的时候会触发ApplicationEventDispatcher将向RMApp post 一个START event, App 收到event之后会触发RMAppSavingTransition来保存当前RMApp instance的当前state,如果recover功能打开,则以后可以从这里重新启Application。
在StateStore保存完Application的state 之后, Application 进入SAVING 状态,面state store 对像会向dispatcher 发送APP_SAVED event:
notifyDoneStoringApplication(appId, storedException);
private void notifyDoneStoringApplication(ApplicationId appId,
Exception storedException) {
rmDispatcher.getEventHandler().handle(
new RMAppStoredEvent(appId, storedException));
}
图 2-1
APP_SAVED Handle
当App收到App_Saved 事件时,会确认当前状态是NEW_SAVING,并检查App status保存过程是否有错。 没有错误发生,则创建一个新RMAppAttemptImpl对像,并启动AppAttempt状态机:
RMAppAttempt attempt =
new RMAppAttemptImpl(appAttemptId, rmContext, scheduler, masterService,
submissionContext, conf);
attempts.put(appAttemptId, attempt);
currentAttempt = attempt;
if(startAttempt) {
handler.handle(
new RMAppAttemptEvent(appAttemptId, RMAppAttemptEventType.START));
}
图 3-1
这后,RMApp进入SUBMIITTED 状态。
APP_ACCEPTED Handle
RMApp收到该事件直接进入 ACCEPTED状态。这个事件,将由Scheduler触发。
ATTEMPT_REGISTERED Handle
当AppAttempt 注册成功之后, 会发一个ATTEMPT_REGISTERED事件,App进入Running 状态。
ATTEMPT_FINISHING Handle
Application 执行完成之后,AppAttempt对像将发送一个ATTEMPT_FINISHING事件,App记录最后完成时间,并进入,FINISHING 状态。