接着昨天的繼續看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的配置文件