yarn3.2源码分析之YarnClient与ResourceManager通信之submitApplication(三)

概述

submitApplication会经过一系列Event:

  1. app_accepted类型的RMAppEvent  
  2. start类型的RMAppAttemptEvent 
  3. appAttemptAdd类型的SchedulerEvent 
  4. AttemptAdded类型的RMAppAttemptEvent 
  5. storeAppAttempt类型的RMStateStoreEvent 
  6. AttemptNewSaved类型的RMAppAttemptEvent 
  7. launch类型的AMLaucherEvent

在处理app_accepted类型的RMAppEvent的过程中,创建RMAppAttempt。

在处理start类型的RMAppAttemptEvent的过程中,记录RMAppAttempt id到ApplicationMasterService。

在处理 appAttemptAdd类型的SchedulerEvent的过程中,获取AbstractYarnScheduler中的applications集合,记录其相应appId的currentAppAttempt为此RMAppAttempt。

在处理storeAppAttempt类型的RMStateStoreEvent的过程中,将RMAppAttempt封装成ApplicationAttemptStateData,存储到RMStateStore。

在处理AttemptNewSaved类型的RMAppAttemptEvent的过程中,注册ClientTokenMasterKey。

 

 

 StartAppAttemptTransition处理APP_ACCEPTED类型的RMAppEvent

中央异步调度器AsyncDispatcher将RMAppEvent分发给ApplicationEventDispatcher处理。

ApplicationEventDispatcher获取RMAppEvent对应的RMAppImpl,委托给RMAppImpl处理RMAppEvent。

RMAppImpl注册处理app_accepted类型的RMAppEvent的Transition。

 .addTransition(RMAppState.SUBMITTED, RMAppState.ACCEPTED,
        RMAppEventType.APP_ACCEPTED, new StartAppAttemptTransition())

StartAppAttemptTransition创建RMAppAttemptImpl实例,然后创建start类型的RMAppAttemptEvent,并提交给AsyncDispatcher

private static final class StartAppAttemptTransition extends RMAppTransition {
    @Override
    public void transition(RMAppImpl app, RMAppEvent event) {
      app.createAndStartNewAttempt(false);
    };
  }

private void
      createAndStartNewAttempt(boolean transferStateFromPreviousAttempt) {
    createNewAttempt();
    handler.handle(new RMAppStartAttemptEvent(currentAttempt.getAppAttemptId(),
      transferStateFromPreviousAttempt));
  }

 public RMAppStartAttemptEvent(ApplicationAttemptId appAttemptId,
      boolean transferStateFromPreviousAttempt) {
    super(appAttemptId, RMAppAttemptEventType.START);
    this.transferStateFromPreviousAttempt = transferStateFromPreviousAttempt;
  }


ApplicationAttemptEventDispatcher处理start类型的RMAppAttemptEvent

ResourceManager的内部类RMActiveService为AsyncDispatcher注册RMAppAttemptEvent类型的处理器—— ApplicationAttemptEventDispatcher

 @Override
    protected void serviceInit(Configuration configuration) throws Exception {
 
      // Register event handler for RmAppAttemptEvents
      rmDispatcher.register(RMAppAttemptEventType.class,
          new ApplicationAttemptEventDispatcher(rmContext));
}

中央异步调度器AsyncDispatcher将RMAppAttemptEvent分发给 ApplicationAttemptEventDispatcher处理。

ApplicationAttemptEventDispatcher获取RMAppAttemptEvent对应的RMAppAttemptImpl,委托给RMAppAttemptImpl处理RMAppAttemptEvent。

@Private
  public static final class ApplicationAttemptEventDispatcher implements
      EventHandler<RMAppAttemptEvent> {

    private final RMContext rmContext;

    public ApplicationAttemptEventDispatcher(RMContext rmContext) {
      this.rmContext = rmContext;
    }

    @Override
    public void handle(RMAppAttemptEvent event) {
      ApplicationAttemptId appAttemptId = event.getApplicationAttemptId();
      ApplicationId appId = appAttemptId.getApplicationId();
      RMApp rmApp = this.rmContext.getRMApps().get(appId);
      if (rmApp != null) {
        RMAppAttempt rmAppAttempt = rmApp.getRMAppAttempt(appAttemptId);
        if (rmAppAttempt != null) {
          try {
            rmAppAttempt.handle(event);
          } catch (Throwable t) {
            LOG.error("Error in handling event type " + event.getType()
                + " for applicationAttempt " + appAttemptId, t);
          }
        } else if (rmApp.getApplicationSubmissionContext() != null
            && rmApp.getApplicationSubmissionContext()
            .getKeepContainersAcrossApplicationAttempts()
            && event.getType() == RMAppAttemptEventType.CONTAINER_FINISHED) {
          // For work-preserving AM restart, failed attempts are still
          // capturing CONTAINER_FINISHED events and record the finished
          // containers which will be used by current attempt.
          /
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值