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的配置文件
     
     
     
  • 相关阅读:
    ubuntu系统里常用的几个命令
    Vue中常用知识点demo
    Vue基础知识学习(后端)
    ubuntu内lnmp相关操作命令
    linux下安装lnmp集成环境
    js时间戳与日期格式之间相互转换
    yii2中 选择布局的方式,可以设置不使用布局
    yii2中通过migration创建数据表
    php实现支付宝在线支付和扫码支付demo
    linux下添加用户并将文件夹授权给某一个用户
  • 原文地址:https://www.cnblogs.com/nashiyue/p/5887785.html
Copyright © 2011-2022 走看看