配置系统是复杂软件必不可少的一部分,org.apache.hadoop.conf.Configuration在Hadooop各个子项目中发挥着重要作用。
windows系统广泛使用一种特殊批的ASCII文件.ini作为其主要配置文件标准,被称为(Initialization File)或概要文件(profile);java中JDK提供了java.util.Properties类处理简单的配置文件。而Hadoop采用自己独有的配置文件管理系统。
Hadoop的配置文件的根元素是configuration,一般只包含子元素property,每个property元素就是一个配置项,配置文件不支持分层或分级。在configuration中,每个属性都是String类型,值类型可以是多种类型。
合并资源指交将多个配置文件合并,通过loadResources()方法实现的。如果两个配置资源包含了相同的配置项,而且前一个没有标记为final,那么后面的配置将覆盖前面的配置。
hadoop系统还有一个重要 功能 ,就是支持属性扩展。如dfs.name.dir的值为${hadoop,tmp.dir}/dfs/name。其中${hadoop,tmp.dir}会使用Configuration中的相应属性进行扩展。
使用Configuration类的一般过程是:构造Configuration对象 ,并通过类的addResource()方法添加需要加载的资源;然后就可以使用get*方法和set*方法访问/设置配置项,资源会在第一次使用的时候自动加载到对象中。
Configuration的成员变量包括:
(1)-quietmode:boolean,用来设置加载配置的模式。默认true,在加载解析配置文件的过程中,不输出日志信息。
(2)-loadDefaults:boolean,服务业确定是否加载默认资源,这些资源保存在defaultResources中。
(3)-defaultResources:ArrayList<String>,是个静态成员变量,通过方法addDefaultResource()可以添加系统的默认资源。
(4)-resources:ArrayList<Object>,保存所有通过 addResource()方法添加Configuration对象的资源。
(5)-properties:Properties,Hadoop配置文件解析后的键-值对都存放在properties中。
(6)-finalParameters:Set<String>,用来保存所有配置文件中已经被声明为final的键-值对的键。
(7)-overlay:Properties,用来记录通过set()方式改变的配置项,即,是应用设置的,不是通过配置资源解析得到的。
(8)-classLoader:ClassLoader,是一个类加载器变量,可以用来加载指定类,也可以是相关的资源。
资源通过对象的addResource()方法或类的静态addDefaultResource()方法添加到了Configuration对象中,添加的资源并不会立即被加载,只是通过 reloadConfiguration()方法清空properties和finalParameters。静态方法addDefaultResource()通过 静态成员REGISTRY来清空Configuration对象中的数据。
Hadoop的配置文件都是古非今XML形式,JAXP(java API for XML Processing)是一种稳定、可靠的XML处理API,支持SAX(simple API for XML)和DOM两种XML处理方法。SAX提供一种流式的、事件驱动的XML处理方式,但编写处理逻辑比较复杂,比较适合处理大的XML文件。DOM是首先将XML文档一次性装入内存;然后根据文档中定义的元素和属性在中建立一个“树形结构”,也就是一个文档对象模型,将文档对象 化,文档中每个节点对应着模型中一个对象;然后 使用对象 提供 的编程接口,访问XML文档进行操作XML文档。
Configurable是一个简单的接口,如果一个类实现了它,意味着这个类是可配置的。即可通过 为这个类的对象传入一个Configuration实例,来提供对象工作需要的一些配置信息。