StoreAppTransition(详见3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhusirong/article/details/83591780

StoreAppTransition(基于hadoop 2.7.6)

主要实现了两个逻辑:
1.将应用程序application的结构数据存储到ZK上(存储目录:/rmstore/ZKRMStateRoot/RMAppRoot/$appId).
2.用rmDispatcher全局调度器触发RMAppEventType.APP_NEW_SAVED事件,该事件的transition是AddApplicationToSchedulerTransition.

StoreAppTransition变换处理器处理后,RMStateStoreState由ACTIVE转换为FENCED.

单纯,直接上代码清单

private static class RMStateStore.StoreAppTransition
      implements MultipleArcTransition<RMStateStore, RMStateStoreEvent,
          RMStateStoreState> {
    @Override
    public RMStateStoreState transition(RMStateStore store,
        RMStateStoreEvent event) {
      if (!(event instanceof RMStateStoreAppEvent)) {
        // should never happen
        LOG.error("Illegal event type: " + event.getClass());
        return RMStateStoreState.ACTIVE;
      }
      boolean isFenced = false;
      ApplicationStateData appState =
          ((RMStateStoreAppEvent) event).getAppState();
          /**
            从提交的上下文中获得applicationId,在客户端提交应用程序时,已经通过rpc接口getNewJobID,从服务端获得了applicationId.
          */
      ApplicationId appId =
          appState.getApplicationSubmissionContext().getApplicationId();
      LOG.info("Storing info for app: " + appId);
      try {
      /**
    	   * 	将application结构数据存储在ZK上,目录为:/rmstore/ZKRMStateRoot/RMAppRoot/$appId
    	   */
        store.storeApplicationStateInternal(appId, appState);
        /**
         * 	用rmDispatcher全局调度器触发RMAppEventType.APP_NEW_SAVED
         */
        store.notifyApplication(new RMAppEvent(appId,
               RMAppEventType.APP_NEW_SAVED));
      } catch (Exception e) {
        LOG.error("Error storing app: " + appId, e);
        isFenced = store.notifyStoreOperationFailedInternal(e);
      }
      return finalState(isFenced);
    };
  }

主要是store.notifyApplication方法,其参数event是RMAppEventType.APP_NEW_SAVED类型事件,其代码清单如下:

private void notifyApplication(RMAppEvent event) {
	  /**
	   *  rmDispatcher是ResourceManager的全局调度器
	   */
    rmDispatcher.getEventHandler().handle(event);
  }

因为rmDispatcher是ResourceManager的全局调度器,根据详见1的介绍,RMAppEventType类型的事件最后是RMAppImpl处理,那么我们到RMAppImpl找RMAppEventType.APP_NEW_SAVED对应的transition,是AddApplicationToSchedulerTransition.
提交的上下文中的 applicationId的生成见ApplictionId的生成.

猜你喜欢

转载自blog.csdn.net/zhusirong/article/details/83591780