zoukankan      html  css  js  c++  java
  • Hadoop Yarn源码

    
    
    接着昨天的继续看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的配置文件
     
     
     
  • 相关阅读:
    LeetCode 811. Subdomain Visit Count (子域名访问计数)
    LeetCode 884. Uncommon Words from Two Sentences (两句话中的不常见单词)
    LeetCode 939. Minimum Area Rectangle (最小面积矩形)
    LeetCode 781. Rabbits in Forest (森林中的兔子)
    LeetCode 739. Daily Temperatures (每日温度)
    三种方式实现按钮的点击事件
    239. Sliding Window Maximum
    14.TCP的坚持定时器和保活定时器
    13.TCP的超时与重传
    12.TCP的成块数据流
  • 原文地址:https://www.cnblogs.com/nashiyue/p/5887785.html
Copyright © 2011-2022 走看看