2021SC@SDUSC
1.Hadoop配置信息处理
1.1 Windows 操作系统的配置文件
Windows 系统广泛使用一种特殊化的 ASCII 文件(以“ini”为文件扩展名)作为它的主要配置文件标准。INI文件被称为初始化文件(Initialization File)或概要文件(profile)。应用程序可以拥有自己的配置文件,存储应用的设置信息,也可以访问 Windows 的基本系统配置文件 win.ini 中存储的配置信息。INI 文件将配置信息分为“节”,节标题放在方括号中。
下面是一段INI文件的示例:
[owner]
name=John Doe
organization=Acme Widgets Inc.
[database]
server=192.0.2.62 ; //使用 IP 地址,在域名解析不能使用时还能正常工作
port=143
file="payroll.dat"
如上面例子中的 [database],就是 database 节的节标题。"节"用于对配置数据做一个归类,每一个节可以包含一些与之相关的“项”(ENTRY),并通过等号对其进行赋值(VALUE)。
其中一般形式为:
[SECTION]
ENTRY=VALUE
Windows 操作系统同时还提供了一些 API,用来对配置文件进行读、写。如使用
GetProfileString() 函数可以从配置文件 win.ini 中获取字符串型配置,使用 GetPrivateProfileInt()
函数可以从私有的配置文件中读取一个配置整数型项。该函数的原型如下:
UINT WINAPI GetPrivateProfileInt(
__in LPCTSTR lpAppName,
__in LPCTSTR lpKeyName,
__in INT nDefault,
__in LPCTSTR lpFileName
);
其 中, 参 数 LPCTSTR lpFileName 是 INI 文 件 的 文 件 名,LPCTSTR lpAppName 和
LPCTSTR lpKeyName 分别是上述的“节”和“项”,INT nDefault 是默认值,也就是说,如
果在配置文件中找不到配置信息,就返回该默认值。
1.2 Java配置文件
JDK 提供了 java.util.Properties 类,用于处理简单的配置文件,相对于 INI 文件,Properties 处理的配置文件格式非常简单,它只支持键 – 值对,“=”左边为键,右边为值。形式如下:
ENTRY=VALUE
java.util.Properties 中用于处理属性列表的主要方法如下,其中,getProperty() 用于在属性
列表中获取指定键(参数 key)对应的属性,它有两个形式,一个不提供默认值,另一个可以
提供默认值。Properties.setProperty() 用于在属性列表中设置或更新属性值。
// 用指定的键在此属性列表中搜索属性
public String getProperty(String key)
// 功能同上,参数 defaultValue 提供了默认值
public String getProperty(String key, String defaultValue)
// 最终调用 Hashtable 的方法 put
public synchronized Object setProperty(String key, String value)
Properties 中的属性通过 load() 方法加载,该方法从输入流中读取键 – 值对,而 store()
方法则将 Properties 表中的属性列表写入输出流。
Properties 中的数据也可以以 XML 格式保存,对应的加载和写出方法是loadFromXML() 和 storeToXML()。
下面是以 XML 格式存在的 Properties 配置文件的例子。
<?xml?version="1.0"?encoding="UTF-8"?>
<!DOCTYPE?properties?SYSTEM
"http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Hi</comment>
<entry?key="foo">bar</entry>
<entry?key="fu">baz</entry>
</properties>
2.Hadoop Configuration
Hadoop 配 置 文 件 的 根 元 素 是 configuration, 一 般 只 包 含 子 元 素 property。 每 一 个
property 元素就是一个配置项,配置文件不支持分层或分级。每个配置项一般包括配置属性
的名称 name、值 value 和一个关于配置项的描述 description ;元素 final 和 Java 中的关键字
final 类似,意味着这个配置项是“固定不变的”。final 一般不出现,但在合并资源的时候,
可以防止配置项的值被覆盖。
Hadoop 配置文件采用 XML 格式,下面是 Hadoop 配置文件的一个例子:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>io.sort.factor</name>
<value>10</value>
<description>The number of streams to merge at once while sorting
files. This determines the number of open file handles.</description>
</property>
<property>
<name>dfs.name.dir</name>
<value>${hadoop.tmp.dir}/dfs/name</value>
<description>Determines where on the local filesystem the DFS name
nodeshould store the name table(fsimage). ……</description>
</property>
<property>
<name>dfs.web.ugi</name>
<value>webuser,webgroup</value>
<final>true</final>
<description>The user account used by the web interface.
Syntax: USERNAME,GROUP1,GROUP2, ……</description>
</property>
</configuration>
在上面的示例文件中,配置项 dfs.web.ugi 的值是“webuser,webgroup”,它是一个 final
配置项 ;从 description 看,这个配置项配置了 Hadoop Web 界面的用户账号,包括用户名和
用户组信息。这些信息可以通过 Configuration 类提供的方法访问。
在上述代码中,getInt("io.sort.factor") 将返回整数 10 ;而 getStrings("dfs.web.ugi")
返回一个字符串数组,该数组有两个元素,分别是 webuser 和 webgroup。
在 Configuration 中,每个属性都是 String 类型的。
使 用 Configuration 类 的 一 般 过 程 是 : 构 造 Configuration 对 象, 并 通 过 类 的
addResource() 方法添加需要加载的资源 ;然后就可以使用 get* 方法和 set* 方法访问 / 设置
配置项,资源会在第一次使用的时候自动加载到对象中。
本次代码分析主要是从Hadoop的配置信息处理和配置文件展开的,经过了这次分析,也是我进一步了解了hadoop源码的构成.