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的配置文件
相关文章
相关标签/搜索