org.apache.hadoop.yarn.conf.ConfigurationProviderFactory分析加载配置文件两种方式

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); //org.apache.hadoop.yarn.LocalConfigurationProvider默认使用的类
  } 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,//查看用户配置项yarn.resourcemanager.configuration.provider-class如果没有使用默认Provider
          defaultProviderClass, ConfigurationProvider.class),
          bootstrapConf);
  return configurationProvider;
}

具体查看一下两种方式源码,一目了然

public static final List<String> RM_CONFIGURATION_FILES =
    Collections.unmodifiableList(Arrays.asList(
        CS_CONFIGURATION_FILE,
        HADOOP_POLICY_CONFIGURATION_FILE,
        YARN_SITE_CONFIGURATION_FILE,
        CORE_SITE_CONFIGURATION_FILE));

 

org.apache.hadoop.yarn.LocalConfigurationProvider

基于linux本地加载配置文件

@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); //Configuration方法
  }
  return new FileInputStream(name);
}

public InputStream getConfResourceAsInputStream(String name) {
  try {
    URL url= getResource(name);

    if (url == null) {
      LOG.info(name + " not found");
      return null;
    } else {
      LOG.info("found resource " + name + " at " + url);
    }

    return url.openStream();
  } catch (Exception e) {
    return null;
  }
}

org.apache.hadoop.yarn.FileSystemBasedConfigurationProvider

不多解析看到这两个变量就知道了。基于非Linux本地系统加载配置文件(可能描述不准确)。

private FileSystem fs;
private Path configDir;

@Override
public synchronized 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");
  }
  Path filePath;
  if (YarnConfiguration.RM_CONFIGURATION_FILES.contains(name)) {
    filePath = new Path(this.configDir, name);
    if (!fs.exists(filePath)) {
      LOG.info(filePath + " not found");
      return null;
    }
  } else {
    filePath = new Path(name);
    if (!fs.exists(filePath)) {
      LOG.info(filePath + " not found");
      return null;
    }
  }
  return fs.open(filePath);
}

时间: 2024-07-30 20:27:24

org.apache.hadoop.yarn.conf.ConfigurationProviderFactory分析加载配置文件两种方式的相关文章

002-UIImageView和UIButton对比 UIImageView的帧动画 格式符补充 加载图片两种方式 添加删除SUBVIEW

一>.UIImageView和UIButton对比 显示图片 1> UIImageView只是一种图片(图片默认会填充整个UIImageView)  image\setImage: 2> UIButton能显示2种图片 * 背景 (背景会填充整个UIButton)  setBackgroundImage:forState: * 前置(覆盖在背景上面的图片,按照之前的尺寸显示)  setImage:forState: * 还能显示文字 点击事件 1> UIImageView默认是不能

cocos2d-x的lua脚本加载CocostudioUI两种方式

前言 当前版本使用的是quick cocos2dx lua 3.3.UI使用cocostudio编辑器.我们在程序里面可以使用两种方式进行解析UI.开始的时候用的是quick的方法,结果遇到了坑(百分比控件布局,你们可以自己试一下什么效果). 我在后面简单提一下,不过不是自己遇到的坑,就不知道有多坑. 一.quick使用cocostudio 1.加载 local uiNode = cc.uiloader:load("TestUI.json") self:addChild(uiNode)

xib加载的两种方式

•Xib文件的加载 Ø方法1 NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"AppView" owner:nil options:nil]; 这个方法会创建xib中的所有对象,并且将对象按顺序放到objs数组中 (如果xib如右图所示,那么objs数组中依次会有3个对象:1个UIView.1个UIButton.1个UISwitch) Ø方法2 bundle参数可以为nil,默认就是main bundle UINib *nib

点评js异步加载的4种方式

主要介绍了点评js异步加载的4种方式,帮助大家更全面的了解js异步加载方式,感兴趣的小伙伴们可以参考一下 js异步加载的4种方式,点评开始. <!DOCTYPE html> <html> <head> <script src="http://common.cnblogs.com/script/jquery.js" type="text/javascript"></script> <script typ

一步步分析Java深拷贝的两种方式-clone和序列化

今天遇到一道面试题,询问深拷贝的两种方法.主要就是clone方法和序列化方法.今天就来分析一下这两种方式如何实现深拷贝.如果想跳过解析的朋友,直奔"重点来了!"寻找答案. clone方法 例1:我们不妨建立一个Exam对象 考试类Exam.java文件 public class Exam implements Cloneable { private int examId; private String examName; public Exam() { } public Exam(in

APP中数据加载的6种方式-b

我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以轻松自在的享受等待,对加载后的内容有明确的预期呢? 设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载中的设计,所以会导致我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数

JS异步加载的几种方式

一:同步加载 我们平时使用的最多的一种方式. <script src="http://yourdomain.com/script.js"></script> <script src="http://yourdomain.com/script.js"></script> 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作.所以默认同步执行才是安全的.但这样如果js中有输

iOS APP中数据加载的6种方式

我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数据加载等待,甚至在无网络的时候,整个处于不可用状态.那么我们怎么处理好界面交互中的加载设计,保证体验无缝衔接,保证用户没有漫长的等待感,而可以轻松自在的享受等待,对加载后的内容有明确的预期呢? 设计师在进行APP设计的设计时,往往会更加专注于界面长什么样,界面和界面之间怎么跳转,给予用户什么样的操作反馈,却偏偏特别容易忽略掉一个比较重要的环节,就是APP数据加载中的设计,所以会导致我们看到的APP,往往有着华丽的启动界面,然后就是漫长的数

Flask程序相关配置加载的三种方式

方式一:从对象中加载配置 1.定义配置类,在配置类中添加相应的配置 2.通过app.config.from_object(配置类)进行加载 代码如下: from flask import Flask app=Flask(__name__) # =======从对象中加载配置========= class Config(object): DEBUG=True app.config.from_object(Config) @app.route("/") def index(): retur