江山疯宇晴

HadoopSourceAnalyse---RMApp FSM

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 状态。

ATTEMPT_FINISHED



posted on 2013-04-27 15:12  江山疯宇晴  阅读(284)  评论(0编辑  收藏  举报

导航