配置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));