Common简介
从Hadoop 0.20版本开始,原来Hadoop项目的Core部分更名为Hadoop Common。Common为Hadoop的其他项目提供一些常用工具,主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。
配置信息处理
一般的软件都会有一个配置模块,来作为扩展、定制的手段和方式。Hadoop使用配置文件将系统中的重要属性以文件的形式进行持久化,使得这些属性可以被重启后的进程或者不同的进程使用。配置文件非常重要,但却没有标准。
1 Windows配置文件
Windows使用一种特殊化的ASCII文件,以.ini为文件扩展名,该文件也称为初始化文件(Initialization File)。
INI文件中配置信息分为“节”,用于对配置数据做一个归类,每一个节可以包含一些与之相关的“项“,格式如下:
[SECTION]
ENTRY=VALUE ;其中VALUE可以有两种类型:数型或字符串。
最后系统会提供一些API来对配置文件进行读、写。
2 Java环境配置文件
JDK提供了java.util.Properties类,继承自Hashtable,所以不支持“节”,就是简单的健-值对。
3 Hadoop配置文件
Hadoop使用了一套独有的配置文件管理系统,用org.apache.hadoop.conf.Configuration来处理配置信息,并提供自己的API。Hadoop配置文件采用XML格式。
<configuration>
<property>//配置文件不支持分层或分级,每个property就是一个配置项。
<name></name>
<value></value>
<description></description>
</property>
</configuration>
重点:Configuration类中的资源加载、资源合并和属性扩展等处理过程。
3.1 资源加载,通过对象的addResource()方法添加到Configuration对象中,添加的资源并不会立即被加载,只是清空成员变量properties(Hadoop配置文件解析后的健-值对都存放在JDK中的properties中)和finalParameters(保存声明为final的健-值对的健)。
properties中的数据,直到需要的时候才会被加载进来,采用了延迟加载的设计模式。
SAX(Sinple API for XML)提供一种流式的、事件驱动的XML处理方式,但编写处理逻辑比较复杂,适合处理大XML文件。
DOM(Document object Model)先将XML文档装入内存,然后根据文档中定义的元素和属性在内存中创建一个“树形结构”,也就是一个文档对象模型,将文档对象化,文档中每个节点对应着模型中一个对象;然后使用对象提供的编程接口,访问XML文档进而操作XML文档。Hadoop的配置文件都是小文件,因此Configuration使用DOM方式处理XML。
3.2 资源合并,多次调用Configuration.addResource()将多个配置文件合并成一个。如果两个配置资源包含有相同的配置项,而且前一个资源的配置项没有标记为final,那后面的配置项将覆盖前面的配置项。
使用get*和set*访问/设置配置项
get*一共有21个方法,最重要的是get()方法,它根据配置项的健获取对应的值,如果健不存在,则返回默认值。其他的方法都依赖Configuration.get(),并在此基础上做进一步处理。Configuration.get()会调用Configuration的私有方法substituteVars(),该方法通过正则表达式完成配置项的属性扩展(属性扩展最多只能进行20次,避免扩展出现死循环)。
set*对输入进行类型转换等处理后,最终调用Configuration.set(),保存传入的健-值对。
3.3 属性扩展,Configuration.get()会调用Configuration的私有方法substituteVars(),该方法通过正则表达式完成配置项的属性扩展。如配置项dfs.name.dir的值是${hadoop.tmp.dir}/dfs/name,其中${hadoop.tmp.dir}会使用Configuration中的相应属性值进行扩展。
Configurable(可配置的)接口,如果一个类实现了Configurable接口,意味着这个类是可配置的。也就是说,可以通过为这个类的对象传入一个Configuration实例,提供对象工作需要的一些配置信息。