Hadoop Yarn源碼 - day2

 
 
 
 
接着昨天的繼續看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的配置文件
相關文章
相關標籤/搜索