Hadoop-0.12.2源代码:Configuration类

来源:互联网 发布:java获取字符串编码 编辑:程序博客网 时间:2024/05/21 15:27

Configuration类位于org.apache.hadoop.conf包中,是Hadoop文件系统的配置类,用来根据配置文件中指定的配置项来创建一个配置实例。

从Configuration类的源代码可以看到,定义了如下6个私有成员变量:

private boolean   quietmode = true;
private ArrayList defaultResources = new ArrayList();
private ArrayList finalResources = new ArrayList();

private Properties properties;
private Properties overlay;
private ClassLoader classLoader;

其实,只要把这些成员变量的具体含义弄明白了,就清楚了在Configuration类中,都是为了填充这些变量而实现了一些解析、设置、获取等等方法。下面分别对每个私有的成员变量的含义进行解释。

第一个是boolean型变量quietmode,用于设置加载配置的模式。通过阅读源代码就可以清楚,这个quietmode如果为true,实际上默认就为true,加载配置的模式为快速模式,其实也就是在解析配置文件的过程中,不输出日志信息,就这么简单。

具体地,可以从Configuration类源代码中,方法private synchronized Properties getProps()中调用了private void loadResources(Properties props, ArrayList resources,boolean reverse, boolean quiet)方法:

      loadResources(newProps, defaultResources, false, quietmode);
      loadResources(newProps, finalResources, true, true);

可以看到,加载defaultResources和finalResources都是使用的quietmode模式。看一下这个方法的实现:

private void loadResources(Properties props, ArrayList resources, boolean reverse, boolean quiet) {
    ListIterator i = resources.listIterator(reverse ? resources.size() : 0);
    while (reverse ? i.hasPrevious() : i.hasNext()) {
      loadResource(props, reverse ? i.previous() : i.next(), quiet);
    }
}

在这个调用的实现过程中,又调用了真正解析并加载配置文件的private void loadResource(Properties properties, Object name, boolean quiet)方法,实现可以查看源代码,下面是在该方法中根据quietmode来判断是否写入日志:

          if (!quiet) {
            LOG.info("parsing " + url);
          }

这个是针对加载URL资源的时候,是否写入日志,另外还有两种分别是String和Path。从这里就可以了解到,Hadoop在创建配置类的时候,考虑了三种资源:

URL资源(网络资源,指的是一个链接);

CLASSPATH资源(String形式);

Hadoop文件系统中的Path资源(该资源是基于Hadoop的FileSystem的,使用斜线“/”作为分隔符,如果是绝对路径,应该以“/”开始)。

第二个是defaultResources,它是一个列表,该列表中存放的是配置文件的名称,可以包括上面提到的三种资源。defaultResources默认加载的是CLASSPATH资源,可以从Configuration类构造方法看到:

public Configuration() {
    defaultResources.add("hadoop-default.xml");
    finalResources.add("hadoop-site.xml");
}

Configuration类中,根据defaultResources列表中的hadoop-default.xml配置文件,从CLASSPATH中读取并解析。

也可以通过调用 public void addDefaultResource(Object object)方法来向defaultResources中动态添加配置文件,其中这里Object object包括String、URL和Path。

第三个是finalResources,它也是一个列表,表示最终生效的配置文件列表,包括上面的三种资源。默认情况下(如果不对hadoop-site.xml进行设置),会加载defaultResources中的hadoop-default.xml配置文件。

也可以通过调用 public void addFinalResource(Object object)方法来向finalResources中动态添加配置文件,其中这里Object object包括String、URL和Path。

第四个是properties,它是一个Properties变量,而Properties继承自Hashtable,也就是properties是Hashtable属性变量。而且,Properties变量可以被保存到流中,也可以从一个流中来加载。properties对应于默认的defaultResources列表中配置文件hadoop-default.xml,当解析hadoop-default.xml的时候,得到的是键值对形式的数据,将这些键值对形式的配置项全部设置到properties变量中,这样在Hadoop文件系统实例化以后,在该文件系统上执行任务就可以快速地获取到指定属性对应的属性值。

第五个是overlay,它也是一个Properties变量。它对应于finalResources列表,也就是解析finalResources列表中设置的配置文件,配置项设置到overlay中。

这里,overlay比较关键的一点就是,如果overlay不为空属性配置,在创建一个Configuration实例的时候会检查overlay,不空就将其中的配置项加入到properties中,可以从Configuration类的如下方法中看到:

private synchronized Properties getProps() {
    if (properties == null) {
      Properties newProps = new Properties();
      loadResources(newProps, defaultResources, false, quietmode);
      loadResources(newProps, finalResources, true, true);
      properties = newProps;
      if(overlay!=null)
        properties.putAll(overlay);
    }
    return properties;
}

在执行 properties.putAll(overlay);的时候,如果properties中某个默认的配置项,在overlay中也存在一个,就会使用overlay中的该对应配置项的值覆盖掉properties中的该配置项的值。

第六个是classLoader,是一个类加载器变量,可以通过它来加载指定类,也能够通过加载相关的资源,例如,在Configuration类中:

public URL getResource(String name) {
    return classLoader.getResource(name);
}

根据一个String字符串获取到一个URL资源。

上面介绍了Configuration类的6个私有成员变量,基本上可以了解到在该类中都需要做哪些事情,关于具体是如何实现的,可以阅读源代码。

Configuration类有两个构造方法。一个是默认的无参构造方法:

public Configuration() {
    defaultResources.add("hadoop-default.xml");
    finalResources.add("hadoop-site.xml");
}

加载两个配置文件。

另一个是通过传递一个Configuration类的参数来构造:

public Configuration(Configuration other) {
    this.defaultResources = (ArrayList)other.defaultResources.clone();
    this.finalResources = (ArrayList)other.finalResources.clone();
    if (other.properties != null)
      this.properties = (Properties)other.properties.clone();
    if(other.overlay!=null)
      this.overlay = (Properties)other.overlay.clone();
}

这里,主要是根据已经构造的Configuration类配置来克隆一个Configuration类配置对象。

另外,为了方便操作,包括在默认构造的Configuration类对象的基础上详细设置,或者获取Configuration类配置实例的指定配置项的值,Configuration类实现了一些方法,可以调用它们来设置或者获取。

原创粉丝点击