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

概述

submitApplication会经历的event:launch类型的AMLaucherEvent 

ApplicationMasterLauncher处理launch类型的AMLaucherEvent

ResourceManager的内部类RMActiveService为AsyncDispatcher注册AMLauncherEventType类型的处理器—— ApplicationMasterLauncher

protected void serviceInit(Configuration configuration) throws Exception {
    applicationMasterLauncher = createAMLauncher();
      rmDispatcher.register(AMLauncherEventType.class,
          applicationMasterLauncher);
}

protected ApplicationMasterLauncher createAMLauncher() {
    return new ApplicationMasterLauncher(this.rmContext);
  }

ApplicationMasterLauncher处理AMLauncherEvent

//Runnable队列,通过队列可以在短时间内有大量launch AM的事件提交时起到缓冲作用
private final BlockingQueue<Runnable> masterEvents
    = new LinkedBlockingQueue<Runnable>();

@Override
  public synchronized void  handle(AMLauncherEvent appEvent) {
    AMLauncherEventType event = appEvent.getType();
    RMAppAttempt application = appEvent.getAppAttempt();
    switch (event) {
    case LAUNCH:
      launch(application);
      break;
    case CLEANUP:
      cleanup(application);
      break;
    default:
      break;
    }
  }

private void launch(RMAppAttempt application) {
//生成AMLauncher
    Runnable launcher = createRunnableLauncher(application, 
        AMLauncherEventType.LAUNCH);
//添加到runnable队列
    masterEvents.add(launcher);
  }

LauncherThread处理Runnable队列中的AMLauncher

private ThreadPoolExecutor launcherPool;

private class LauncherThread extends Thread {
    
    public LauncherThread() {
//线程名
      super("ApplicationMaster Launcher");
    }

    @Override
    public void run() {
      while (!this.isInterrupted()) {
        Runnable toLaunch;
        try {
//从Runnable队列中取出一个AMLauncher
          toLaunch = masterEvents.take();
//将AMLauncher放入线程池中执行
          launcherPool.execute(toLaunch);
        } catch (InterruptedException e) {
          LOG.warn(this.getClass().getName() + " interrupted. Returning.");
          return;
        }
      }
    }
  }    

AMLauncher的run()方法逻辑

public void run() {
    switch (eventType) {
    case LAUNCH:
      try {
        LOG.info("Launching master" + application.getAppAttemptId());
//与NM通信,启动ApplicationMaster
        launch();
//启动成功后,向RMAppAttemptImpl发送RMAppAttemptEventType.LAUNCHED事件
        handler.handle(new RMAppAttemptEvent(application.getAppAttemptId(),
            RMAppAttemptEventType.LAUNCHED, System.currentTimeMillis()));
      } catch(Exception ie) {
        onAMLaunchFailed(masterContainer.getId(), ie);
      }
      break;
    default:
      LOG.warn("Received unknown event-type " + eventType + ". Ignoring.");
      break;
    }
  }

AMLauncher的launch()方法

private void launch() throws IOException, YarnException {
    connect();
    ContainerId masterContainerID = masterContainer.getId();
    ApplicationSubmissionContext applicationContext =
        application.getSubmissionContext();
    LOG.info("Setting up container " + masterContainer
        + " for AM " + application.getAppAttemptId());
//创建ContainerLaunchContext,里面包含着启动AM要执行的命令
    ContainerLaunchContext launchContext =
        createAMContainerLaunchContext(applicationContext, masterContainerID);
//创建startContainerRequest,AM是NM端启动的第一个contaienr,由RM发起
//以后的startContainerRequest都由AM发起
    StartContainerRequest scRequest =
        StartContainerRequest.newInstance(launchContext,
          masterContainer.getContainerToken());
    List<StartContainerRequest> list = new ArrayList<StartContainerRequest>();
    list.add(scRequest);
//rpc请求的消息格式是StartContainersRequest
    StartContainersRequest allRequests =
        StartContainersRequest.newInstance(list);
//代理发起rpc请求
    StartContainersResponse response =
        containerMgrProxy.startContainers(allRequests);
    if (response.getFailedRequests() != null
        && response.getFailedRequests().containsKey(masterContainerID)) {
      Throwable t =
          response.getFailedRequests().get(masterContainerID).deSerialize();
      parseAndThrowException(t);
    } else {
      LOG.info("Done launching container " + masterContainer + " for AM "
          + application.getAppAttemptId());
    }
  }

NM端startContainer

略,请参阅下一篇博客:yarn3.2源码分析之NM端startContainer事件流程

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值