Hadoop教程

配置API

Hadoop中,组件的配置是通过Hadoop提供的API来进行的。一个 Configuration类的实例(可以在org.apache.hadoop.conf包中找到)代表配置属性 及其取值的一个集合。毎个属性由一个String来命名,而值类型可以是多种类型 之一,包括Java基本类型(如boolean, int、long和float)和其他有用的类型(如String、Class、Java.io.File和String集合)。

Configuration从XML文件(由一个简单的结构定义名-值对)中读取其属性值。 参见例5-1。

例5-1.一个简单的配置文件configuration-1.xml

<?xml version="1.0"?>
   <configuration>
     <property>
      <name>color</name>
      <value>yellow</value>
      <description>Color</description>
     </property>

   <property>
    <name>size</name>
    <value>10</value>
    <description>Siz</description>
  </property>

  <property>
    <name>weight</name>
    <valuevheavy</value>
   <final>true</final>
    <description>Weight</description>
   </property>
   <property>
    <name>size-weight</name>
    <value>${size},${weight}</value>
   <description>Size and weight</description>
   </property>
</configuration>

假定此配置文件的文件名是configuration-l.xml,我们可以通过如下代码访问其 属性:

Configuration conf = new Configuration();
conf.addResource("configuration-1.xml");
assertThat(conf.get("color"), is("yellow"));
assertThat(conf.getInt("size", 0), is(10));
assertThat(conf.get("breadth", "wide"), is("wide''));

有几点需要注意:XML文件中没有保存类型(type)幻信息,即属性在被读取的时候,可以被解释为指定的类型。此外,get()方法允许为XML文件中没有定义的 属性指定默认值,正如上述代码中最后一行的breath属性一样。

合并多个源文件

当多个源文件被用来定义一个配置时,事情变得有趣了。Hadoop分离了系统的默 认属性(在core-default.xml文件内部)和位置相关的覆盖属性(在core-site.xml 文件中定义)。例5-2中的文件定义了size属性和weight属性。

例 5-2.第二个配置文件 configuration-2.xml

<?xml version="1.0"?>
<configuration>
<property>
<name>size</name>
<value>12</value>
</property>
<property>
<name>weight</name>
<value>light</value>
</property>
</configuration>

源文件按顺序添加到Configuration:

Configuration conf = new Configuration();
conf.addResource("configuration-l.xml");
conf.addResource("configuration-2.xml");

后来添加到源文件的属性会覆盖(override)之前定义的属性。所以,size属性的取 值来自于第二个配置文件configuration-2.xml:

 assertThat(conf.getInt("size", 0), is(12));

然而,被标记为final的属性不能被后面的定义覆盖。在第一个配置文件中, weight属性的final状态是true,因此,在第二个配置文件中的覆盖尝试失 败,weight取值仍然是heavy: assertThat(conf.get ("weight"), is("heavy"));

试图覆盖final属性的操作一般是配置错误,所以最后会弹出警告消息来帮助进 行故障诊断。一般来说,管理员将守护进程site file中属性标记为final,表明 他们不希望用户在客户端或作业提交参数(job submission parameter)有任何改动。


可变的扩展

配置属性可以用其他属性或系统属性进行定义。例如,在第一个配置文件中的 size-weight属性可以定义为${size}和${weight},而且这些属性是用配置文件 中的值来扩展的:

assertThat(conf.get("sizG-weight"),is("12,heavy”));

系统属性的优先级高于源文件中定义的属性:

System.sGtProperty("size", "14");
assertThat(conf.get("size-weight"),lis("14,heavy"));

该特性适用于使用JVM #S-Dproperty=vatue来覆盖命令行方式下的属性。 注意:配置属性可以通过系统属性来定义,前提是系统属性使用配置属性重新定 义,否则,它们无法通过配置API进行访问。因此有以下配置:

System.setProperty("length","2"); 
assertThat(conf.get("length"), is((String) null));

关注微信获取最新动态