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的生成.