Hadoop配置文件解析

Hadoop源码解析 2 --- Hadoop配置文件解析

1 Hadoop Configuration简介
    Hadoop没有使用java.util.Properties管理配置文件,
也没有使用Apache Jakarta Commons
Configuration管理配置文件,而是使用了一套独有的配置文件管理系统,并提供自己的API,即使用
org.apache.hadoop.conf.Configuration处理配置信息。

org.apache.hadoop.conf目录结构如下:

2 Hadoop配置文件的格式解析
    Hadoop配置文件采用XML格式,下面是Hadoop配置文件的一个例子:

    <?xml version="1.0"?>
    <?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
    <configuration>
      <property>
         <name>io.sort.factor</name>
         <value>10</value>
         <description>The number of streams to merge at once while sorting
         files.  This determines the number of open file handles.</description>
      </property>
    <property>
         <name>dfs.name.dir</name>
         <value>${hadoop.tmp.dir}/dfs/name</value>
         <description>Determines where on the local filesystem the DFS name
         nodeshould store the name table(fsimage).  ……</description>
      </property>
    <property>
         <name>dfs.web.ugi</name>
         <value>webuser,webgroup</value>
         <final>true</final>
         <description>The user account used by the web interface.
         Syntax: USERNAME,GROUP1,GROUP2, ……</description>
      </property>
    </configuration>

Hadoop配置文件的根元素是configuration,一般只包含子元素property。每一个property元素就是一个配置 项,配置文件不支持分层或分级。每个配置项一般包括配置属性的名称name、值value和一个关于配置项的描述description;元素final 和Java中的关键字final类似,意味着这个配置项是“固定不变的”。final一般不出现,但在合并资源的时候,可以防止配置项的值被覆盖。
    在
上面的示例文件中,配置项dfs.web.ugi的值是“webuser,webgroup”,它是一个final配置项;从description看,
这个配置项配置了Hadoop Web界面的用户账号,包括用户名和用户组信息。这些信息可以通过Configuration类提供的方法访问。
    在
Configuration中,每个属性都是String类型的,但是值类型可能是以下多种类型,包括Java中的基本类型,如
boolean(getBoolean)、int(getInt)、long(getLong)、float(getFloat),也可以是其他类型,如
String(get)、java.io.File(getFile)、String数组(getStrings)等。以上面的配置文件为
例,getInt("io.sort.factor")将返回整数10;而getStrings("dfs.web.ugi")返回一个字符串数组,该数
组有两个元素,分别是webuser和webgroup。
    合并资源指将多个配置文件合并,产生一个配置。如果有两个配置文件,也就是两个资源,如core-default.xml和core-site.xml,通过Configuration类的loadResources()方法,把它们合并成一个配置。代码如下:
    Configurationconf = new Configuration();  
    conf.addResource("core-default.xml");  
    conf.addResource("core-site.xml");
    如
果这两个配置资源都包含了相同的配置项,而且前一个资源的配置项没有标记为final,那么,后面的配置将覆盖前面的配置。上面的例子中,core-
site.xml中的配置将覆盖core-default.xml中的同名配置。如果在第一个资源(core-default.xml)中某配置项被标记
为final,那么,在加载第二个资源的时候,会有警告提示。

3 直接运行Configuration.java则会调用默认配置文件部分结果如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configuration>
<property>
    <name>ipc.client.fallback-to-simple-auth-allowed</name>
    <value>false</value>
    <source>core-default.xml</source>
</property>
<property>
    <name>file.bytes-per-checksum</name>
    <value>512</value>
    <source>core-default.xml</source>
</property>
<property>
    <name>ipc.server.tcpnodelay</name>
    <value>false</value>
    <source>core-default.xml</source>
</property>
<property>
    <name>ftp.client-write-packet-size</name>
    <value>65536</value>
    <source>core-default.xml</source>
</property>
<property>
    <name>nfs3.mountd.port</name>
    <value>4272</value>
    <source>core-site.xml</source>
</property>
</configuration>

4 我们一般在wordcount程序中使用Configuration的set函数来添加或修改相关配置项,下面通过这种途径解析其具体实现方式

4.1 Configuration conf = new Configuration(true)的具体实现如下(见4.1.2):

Configuration有3个构造函数:

4.1.1 如果在新建Configuration对象时无参数,则系统默认调用该构造函数

    public Configuration() {
        this(true);
    }

4.1.2 如果在新建Configuration对象时有boolean类型形参,则调用该构造函数

    /**
     * 1 新建一个Configuration类,如果loadDefaults=false,
     * 则新建的Configuration实例默认不会加载默认的配置文件
     */
    public Configuration(boolean loadDefaults) {
        System.out.println("Configuration(boolean loadDefaults)");
        this.loadDefaults = loadDefaults;// 选择是否加载默认配置文件,false为不加载,true加载
        System.out.println("loadDefaults: " + loadDefaults);
        updatingResource = new HashMap<String, String[]>();// 保存修改过的配置项
        synchronized (Configuration.class) {
            REGISTRY.put(this, null);
        }
    }

4.1.3 如果在新建Configuration对象时有Configuration类型形参,则调用该构造函数

    /**
     *
     * @param 调用其它Configuration对象的配置文件
     */
    @SuppressWarnings("unchecked")
    public Configuration(Configuration other) {
        this.resources = (ArrayList<Resource>) other.resources.clone();
        synchronized (other) {
            if (other.properties != null) {
                this.properties = (Properties) other.properties.clone();
            }

            if (other.overlay != null) {
                this.overlay = (Properties) other.overlay.clone();
            }

            this.updatingResource = new HashMap<String, String[]>(
                    other.updatingResource);
        }

        this.finalParameters = new HashSet<String>(other.finalParameters);
        synchronized (Configuration.class) {
            REGISTRY.put(this, null);
        }
        this.classLoader = other.classLoader;
        this.loadDefaults = other.loadDefaults;
        setQuietMode(other.getQuietMode());
    }

4.2 conf.set("fs.defaultFS", "file///");

set函数有:

public void set(String name, String value, String source)

public void set(String name, String value)

public synchronized void setIfUnset(String name, String value)

public void setInt(String name, int value)

public void setLong(String name, long value)

public void setFloat(String name, float value)

public void setDouble(String name, double value)

public void setBoolean(String name, boolean value)

public void setBooleanIfUnset(String name, boolean value)

public <T extends Enum<T>> void setEnum(String name, T value)

public void setTimeDuration(String name, long value, TimeUnit unit)

public void setPattern(String name, Pattern pattern)

public void setStrings(String name, String... values)

public void setStrings(String name, String... values)

public void setClass(String name, Class<?> theClass, Class<?> xface)

其中,后面的set相关函数都是调用第一个set函数实现,下面就具体解析一下public void set(String name, String value, String source)

    /**
     *
     * @Title        set
     * @Description  将参数name对应的value存入property中,如果该name在property中存在则覆盖,否则添加
     * @param
     * @return
     * @throws
     */
    public void set(String name, String value, String source) {
        System.out.println("set(name, value, source) start !");

        Preconditions.checkArgument(name != null, "Property name must not be null");
        Preconditions.checkArgument(value != null, "The value of property " + name + " must not be null");
        DeprecationContext deprecations = deprecationContext.get();//保存不在配置文件的key
        System.out.println("deprecations: "+deprecations);
        System.out.println("deprecations.getDeprecatedKeyMap().isEmpty(): "+deprecations.getDeprecatedKeyMap().isEmpty());
        if (deprecations.getDeprecatedKeyMap().isEmpty()) {
            getProps();
        }

        getOverlay().setProperty(name, value);
        getProps().setProperty(name, value);
        String newSource = (source == null ? "programatically" : source);

        System.out.println("newSource: " + newSource);
        if (!isDeprecated(name)) {//检测该name(key)项是否在配置文件中存在

            System.out.println("!isDeprecated(name): " + !isDeprecated(name));

            updatingResource.put(name, new String[] { newSource });//将该name(key)项参数添加进updatingResource中,说明该项已被修改
            String[] altNames = getAlternativeNames(name);//判断该name(key)是否在默认配置文件中存在,如果存在则将name存入altNames中

            /**
             * 如果name(key)则默认配置文件中存在,则将name对应value存入updatingResource
             */
            if (altNames != null) {
                for (String n : altNames) {
                    System.out.println("altNames: "+n);
                    if (!n.equals(name)) {
                        getOverlay().setProperty(n, value);
                        getProps().setProperty(n, value);
                        updatingResource.put(n, new String[] { newSource });
                    }
                }
            }
        } else {
            String[] names = handleDeprecation(deprecationContext.get(), name);
            String altSource = "because " + name + " is deprecated";
            for (String n : names) {

                System.out.println("names: "+names);

                getOverlay().setProperty(n, value);
                getProps().setProperty(n, value);
                updatingResource.put(n, new String[] { altSource });
            }
        }
    }

5 Configuration测试程序如下:

/**
 * @Title        ConfigurationTest.java
 * @Package      org.apache.hadoop.conftest
 * @Description  TODO
 * @date         2014年9月11日 上午11:27:14
 * @version      V1.0
 */
package org.apache.hadoop.conftest;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;

public class ConfigurationTest {
    public static void main(String args[]){
        Configuration conf = new Configuration(true);
        Path hadoop_mapred = new Path("hadoop-2.3.0/etc/hadoop/mapred-site.xml");
        Path hadoop_yarn = new Path("hadoop-2.3.0/etc/hadoop/yarn-site.xml");
        conf.addResource(hadoop_mapred);
        conf.addResource(hadoop_yarn);
        conf.set("mapreduce.jobtracker.system.dir", "file:///data1");//this conf can change the same parameter in the mapred-site.xml when the paramter is used
        conf.setInt("test1", 10);//This parameter will be add to property due to it not in the properties
        conf.set("fs.defaultFS", "file///data");//This parameter will change the same parameter value in the properties
        System.out.println(conf.get("test1"));
        System.out.println(conf.get("mapreduce.jobtracker.system.dir"));
        System.out.println(conf.get("yarn.resourcemanager.admin.address"));
        System.out.println("ok");
    }
}

  原创文章欢迎转载,转载时请注明出处。

  作者推荐文章:

    》Java自学之道

    》总结5种比较高效常用的排序算法

    》如何获取系统信息

    》如何生成二维码过程详解

时间: 2024-10-26 09:19:35

Hadoop配置文件解析的相关文章

Spring Boot干货系列:(二)配置文件解析

Spring Boot:配置文件解析   前言 上一篇介绍了Spring Boot的入门,知道了Spring Boot使用"习惯优于配置"(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来.所以,我们要想把Spring Boot玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要了解Spring Boot的配置文件application.properties. 正文 Spring Boot使用了一个全局的配置文件applicat

linuxPAM认证配置文件解析

1.PAM文件 /etc/pam.conf或者/etc/pam.d/ PAM配置文件/lib(64)/security/pam_*.so 可动态加载的PAM service module 2.配置文件格式 /etc/pam.conf:主配置文件 service    type    control    module-path    module-arguments /etc/pam.d/service:服务配置文件 type    control    module-path    modul

MySQL 5.6.24 线上版本配置文件解析

线上MySQL服务器配置文件解析 innodb_buffer_pool_size 非常重要的一个参数,用于配置InnoDB的缓冲池,如果数据库中只有哦Innodb表,则推荐配置量为总内存的75% select  engine,round(sum(data_length + index_length)/1024/1024,1) as 'Total MB' from information_schema.tables  where table_schema not in ('information_

SSH学习之二 OpenSSH配置文件解析

下面是对SSH配置文件的一些选项的分解说明,ssh_config是OpenSSH客户端的配置文件,sshd_config是OpenSSH服务器端的配置文件. ssh_config的内容如下: # This is the ssh client system-wide configuration file.  See ssh_config(5) for more information.  This file provides defaults for users, and the values c

hadoop分布式安装部署具体视频教程(网盘附配好环境的CentOS虚拟机文件/hadoop配置文件)

參考资源下载:http://pan.baidu.com/s/1ntwUij3视频安装教程:hadoop安装.flvVirtualBox虚拟机:hadoop.part1-part5.rarhadoop文件:hadoop-2.2.0.tar.gzhadoop配置文件:hadoop_conf.tar.gzhadoop学习教程:炼数成金-hadoop 虚拟机下载安装:VirtualBox-4.3.12-93733-Win.exehttp://dlc.sun.com.edgesuite.net/virtu

redis概述,特点,与Memached的不同,生产环境主从配置,redis配置文件解析

Redis概述: 是一个基于Key-Value的持久化数据库存储,支持丰富的数据类型,用C语言编写,可基于内存又可持久化的日志型.Key-Value数据库,并提供多种语言的API Redis特点 1.Key-Value健值类型存储 2.支持数据可靠存储及落地 3.单进程单线程高性能服务器 4.单机qps(每秒查询率)可以达到10w 5.适合小数据量高速读写访问 Redis跟Memached的不同 1.Redis可以持久化数据存储 2.性能高很,Redis能支持超过10W每秒的读写频率 3.丰富的

SSH问题:系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 &#39;beans&#39; 的声明“异常

现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 'beans' 的声明r的异常信息. 造成该异常原因有两种: 第一,配置文件头部配置的xsd版本信息不正确,造成解析时出错.spring头部xsd或dtd校验文件的查找分两步,第一先从本地jar包中找,如果找到则用

mybatis配置文件解析原理简略时序图

配置文件解析主要用到XMLConfigBuilder(解析mybatis-config.xml) -->  XMLMapperBuilder(解析mapper.xml) --> XMLStatementBuilder(解析mapper.xml中cache, resultMap等配置信息) -->XMLScriptBuilder(解析mapper.xml中insert update select delete等sql语句节点) 1. 每个SQL语句节点都会生成一个SqlSource,每个S

系统启动时,spring配置文件解析失败,报”cvc-elt.1: 找不到元素 &#39;beans&#39; 的声明“异常

现象:spring加载配置文件applicationContext.xml出错,抛出nested exception is og.xml.sax.SAXParseException; lineNumber: 12; columnNumber: 47; cvc-elt.1: 找不到元素 'beans' 的声明r的异常信息. 造成该异常原因有两种: 第一,配置文件头部配置的xsd版本信息不正确,造成解析时出错.spring头部xsd或dtd校验文件的查找分两步,第一先从本地jar包中找,如果找到则用