Common介绍

来源:互联网 发布:武汉网络推广jw100 编辑:程序博客网 时间:2024/06/05 22:45

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实例,提供对象工作需要的一些配置信息。

0 0
原创粉丝点击