/**
* The ResourceManager is the main class that is a set of components.
* "I am the ResourceManager. All your resources belong to us..."
*
*/
@SuppressWarnings("unchecked")
public class ResourceManager extends CompositeService implements Recoverable {
源码中关于ResourceManager的注释只有寥寥几句。大概意思就是管理集群所有的资源。
仔细看了下ResourceManager的方法列表,瞅到一mian()方法。
public static void main(String argv[]) {
Thread.setDefaultUncaughtExceptionHandler(new YarnUncaughtExceptionHandler());
StringUtils.startupShutdownMessage(ResourceManager.class, argv, LOG);
try {
Configuration conf = new YarnConfiguration();
// If -format-state-store, then delete RMStateStore; else startup normally
if (argv.length == 1 && argv[0].equals("-format-state-store")) {
deleteRMStateStore(conf);
} else {
ResourceManager resourceManager = new ResourceManager();
ShutdownHookManager.get().addShutdownHook(
new CompositeServiceShutdownHook(resourceManager),
SHUTDOWN_HOOK_PRIORITY);
resourceManager.init(conf);
resourceManager.start();
}
} catch (Throwable t) {
LOG.fatal("Error starting ResourceManager", t);
System.exit(-1);
}
}
这里有一关键点,ResourceManager在启动时,首先调用父类init()方法,然后调用start().
这里面有必要说明下继承关系ResourceManager 继承了 CompositeService,CompositeService继承了AbstractService抽象类。
这里使用了模板方法。AbstractService类中定义了init(),start(),stop(),close()等方法的实现,这里就不一一列举其源码的实现了。
在init方法中分别调用了 setConfig 、serviceInit 和notifyListeners三个方法。ResourceManager复写了serviceInit(Configuration conf)方法。
这个方法主要做以下几件事情;
用户登录
// Set UGI and do login
// If security is enabled, use login user
// If security is not enabled, use current user
this.rmLoginUGI = UserGroupInformation.getCurrentUser();
try {
doSecureLogin();
} catch(IOException ie) {
throw new YarnRuntimeException("Failed to login", ie);
}
各种服务的注册(来回翻了下,没有注释,实在不知道是干嘛用的)
下面看看 serviceStart()做了些什么。
protected void serviceStart() throws Exception {
if (this.rmContext.isHAEnabled()) {
transitionToStandby(true);
} else {
transitionToActive();
}
startWepApp();
if (getConfig().getBoolean(YarnConfiguration.IS_MINI_YARN_CLUSTER,
false)) {
int port = webApp.port();
WebAppUtils.setRMWebAppPort(conf, port);
}
super.serviceStart();
}
/**
* An HA service may be in active or standby state. During startup, it is in
* an unknown INITIALIZING state. During shutdown, it is in the STOPPING state
* and can no longer return to active/standby states.
*/
public enum HAServiceState {
INITIALIZING("initializing"),
ACTIVE("active"),
STANDBY("standby"),
STOPPING("stopping");
以上就是ResourceManager启动过程。
这里插一段,hadoop中service的生命周期
/** Constructed but not initialized */
NOTINITED(0, "NOTINITED"),
/** Initialized but not started or stopped */
INITED(1, "INITED"),
/** started and not stopped */
STARTED(2, "STARTED"),
/** stopped. No further state transitions are permitted */
STOPPED(3, "STOPPED");
未完待续……