接着昨天的继续看hadoop-yarn-api,昨天看了api package下的4个协议,今天来看下con package下的代码
conf目录下的内容比较少,就4个文件分别是ConfigurationProvider, ConfigurationProviderFactory,HAUtil以及YarnConfiguration
首先来看YarnConfiguration这个类:
图1 YarnConfiguration 方法截图
YarnConfiguration 类中的方法 |
方法功能 |
YarnConfiguration() |
默认的无参构造函数,调用父类Configuration的构造函数 |
YarnConfiguration(Configuration) |
指定reload一个YarnConfiguration 这里须要传的是YarnConfiguration的实例 |
getClusterId(Configuration) |
得到YarnConfiguration中的RM_CLUSTER_ID,若是没有,抛出一个HadoopILLegalArgumentException |
getRMDefaultPortNumber(String,Configuration) |
根据传来的String参数,取出YarnConfiguration中对应的端口号 |
getServiceAddressConfKeys(Configuration) |
根据是使用http仍是https得到服务地址的ConfKeys。不管是http或者https都含有RM_ADDRESS,RM_SCHEDULER_ADDRESS,RM_ADMIN_ADDRESS,RM_RESOURCE_TRACKER_ADDRESS。只是他们的RM_WEBAPP_ADDRESS不一样,后者是RM_WEBAPP_HTTPS_ADDRESS |
userHttps(Configuration) |
是否使用Https服务 |
addDeprecatedKeys() |
加入过时的Keys |
getSocketAddr(String,String,int) |
得到name指定的socket地址属性,在HA集群上获得的结果是RM_HA_ID表示的结果 |
updateConnectAddr(String,InetSocketAddress) |
更改连结地址(里面的具体实现是使用HAUtil的addSuffix 和 getRMHAId方法)。先使用getRMHAId 获得当前的RMId,若是id为null或者为空串,那么返回就调用父类的updateConnectAddr ,若是不为null,而且不含有特殊字符’.’那么将两者拼接,而后调用父类的方法 |
YarnConfiguration 主要是继承了org.apache.hadoop.conf中的Configuration类,上述表格中的最后两个是成员方法,剩下的都是静态方法。在Configuration中实现了特别多的方法。在一个静态块中加载core-default.xml文件和core-site.xml文件,主要就是管理一堆的KV。
HAUtil里面全是HA的一些辅助静态方法
ConfigurationProvider是一个抽象类,须要子类去实现里面的方法:
图2 ConfigurationProvider方法截图
ConfigurationProviderFactory类中只有一个方法,以下所示:
/**
* Factory for {@link ConfigurationProvider} implementations.
*/
public class ConfigurationProviderFactory {
/**
* Creates an instance of {@link ConfigurationProvider} using given
* configuration.
* @param bootstrapConf
* @return configurationProvider
*/
@SuppressWarnings("unchecked")
public static ConfigurationProvider
getConfigurationProvider(Configuration bootstrapConf) {
Class<? extends ConfigurationProvider> defaultProviderClass;
try {
defaultProviderClass = (Class<? extends ConfigurationProvider>)
Class.forName(
YarnConfiguration.DEFAULT_RM_CONFIGURATION_PROVIDER_CLASS);
} catch (Exception e) {
throw new YarnRuntimeException(
"Invalid default configuration provider class"
+ YarnConfiguration.DEFAULT_RM_CONFIGURATION_PROVIDER_CLASS, e);
}
ConfigurationProvider configurationProvider =
ReflectionUtils.newInstance(bootstrapConf.getClass(
YarnConfiguration.RM_CONFIGURATION_PROVIDER_CLASS,
defaultProviderClass, ConfigurationProvider.class),
bootstrapConf);
return configurationProvider;
}
}
这里面经过反射机制提供了一个默认的ConfigurationProvider(org.apache.hadoop.yarn.LocalConfigurationProvider)无效就抛异常。
找到 LocalConfigurationProvider这个文件,里面的代码以下所示:
public class LocalConfigurationProvider extends ConfigurationProvider {
@Override
public InputStream getConfigurationInputStream(Configuration bootstrapConf,
String name) throws IOException, YarnException {
if (name == null || name.isEmpty()) {
throw new YarnException(
"Illegal argument! The parameter should not be null or empty");
} else if (YarnConfiguration.RM_CONFIGURATION_FILES.contains(name)) {
return bootstrapConf.getConfResourceAsInputStream(name);
}
return new FileInputStream(name);
}
@Override
public void initInternal(Configuration bootstrapConf) throws Exception {
// Do nothing
}
@Override
public void closeInternal() throws Exception {
// Do nothing
}
}
它主要就判断name是不是capacity-schedular.xml,core-site.xml,yarn-site.xml,hadoop-policy.xml文件,若是是,那么直接调的是Configuration的getConfResourceAsInputStream方法,若是不是那么直接用name返回一个FileInputStream
而Configuration中的该方法最终调用classLoader的getResource方法返回一个URL,再经过
url.openStream()返回inputStream,这也解释了为何hadoop须要配置classpath,若是没有配置这个,就Yarn来讲压根取不到这些Configuraton的配置文件