配置系统是复杂软件必不可少的一部分,而Hadoop配置信息处理是学习Hadoop源代码的一个很好的起点。现在就从Hadoop的配置文件谈起。
一、Hadoop配置格式
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</description>
</property>
</configuration>
Hadoop的配置文件跟元素为configuration,一般只包含子元素property。每一个property元素就是一个配置项,配置文件不支持分层或分级,每个配置属性的名称name、值value和一个关于配置项的描述description;元素final和java关键字final类似,意味着这个配置项不可改变,而且在合并资源的时候可以防止配置项的值被覆盖。
如果有两个配置文件,如core-default.xml和core-site.xml.通过Configuration类(org.apache.hadoop.conf包中)的loadResource()方法,把他们合并成一配置文件。代码如下:
Configuration conf = new Configuration();
conf.addResource(“core-default.xml”);
conf.addResource(“core-site.xml”);
如果这两个配置文件都包含了相同的配置项,而且前一个资源的配置项没有标记为final,那么后一个配置将覆盖前一个配置。
Hadoop的配置文件都是XML格式的,JAXP(Java API for XML Processing)是一种稳定、可靠的XML处理API,支持SAX(Simple API for XML)和DOM(Document Object Model)两种XML解析方式。
SAX 提供提供了一种流式的、事件驱动的XML处理方式,但编写处理逻辑比较复杂,适合处理大的XML文件。
DOM与SAX不同,它将XML文档一次性装入内存;然后根据文档中定义的元素和属性在内存中创建一个树形结构---文档对象模型,将文档对象化,文档中每个节点对应着模型中一个对象;然后使用对象提供的编程接口,访问XML文档,进而进行解析和操作XML文档,Hadoop的配置文件都是很小的文件,因此Configuration类使用DOM解析XML配置文件。
二、Hadoop配置文件
Hadoop的配置文件分为两类。
第一类只读类型的默认文件:src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/mapred-default.xml.
第二类为定位设置(site-specific):conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml。
也可以通过设置conf/Hadoop-env.sh来为Hadoop的守护进程设置环境变量(bin目录下)
Hadoop是通过org.apache.hadoop.conf.configuration来读取配置文件的.在Hadoop的设置中,Hadoop的设置中,Hadoop的配置是通过资源(resource)定位的,每个资源由一系列的name/value键值对以XML文件的形式构成,它以一个字符串命名或以Hadoop定义的Path类命名(这个类用于定义问价系统内的文件或者文件夹的)。如果是以字符串命名的,Hadoop会通过classpath调用此文件。如果以Path命名,那么Hadoop会直接在本地文件系统中搜索文件。
资源设定有两个特点。以下两点来自对Hadoop API文档的翻译和理解。
(1)Hadoop允许定义最终参数(final parameters),如果任意资源声明了final这个值,那么之后加载的任何资源都不能改变这个值,定义最终资源的格式是这样的:
<property>
<name>dfs.client.buffer.dir</name>
<value>/tem/Hadoop/dfs/client</value>
<final>true</final>
</property>
(2)Hadoop允许参数传递。示例如下,当tempdir被调用时,basedir会作为值
“/user/${user.name}”被调用。那么tempdir的值为user/${user.name}/temp,相应的${user.name}也会调用其它属性的值。
<property>
<name>basedir</name>
<value>/user/${user.name}</value>
</property>
<property>
<name>tempdir</name>
<value>${basedir}/temp</value>
</property>
下面3个表详细说明了配置文件,hdfs-site.xml、core-site.xml、mapred-site.xml是Hadoop配置最重要的几个文件,在以后的Hadoop安装中会遇到。
参数parameter |
值value |
dfs.name.dir |
NameNode存储名字空间及汇报日志的位置 |
dfs..data.dir |
DataNode存储数据块的位置 |
conf/hdfs-site.xml配置表
参数parameter |
值value |
fs.default.name |
NameNode的IP地址及端口 |
conf/core-site.xml配置表
参数parameter |
值value |
mapreduce.jobtracker.address |
JobTracker的IP地址及端口 |
mapreduce.jobtracker.system.dir |
Mapreduce在HDFS上存储文件的位置,例如/Hadoop/mapred/system/ |
mapreduce.cluster.local.dir |
Mapreducede 缓存数据存储在文件系统中的位置 |
mapred.tasktracker.{map|reduce}.task.maximun |
每台TaskTracker所能运行的Map或Reduce的task最大值 |
dfs.hosts/dfs.hosts.exclude |
允许或禁止的Data |
mapreduce.jobtracker.hosts.filename/ mapreduce.jobtracker.hosts.exclude.filename |
允许或禁止的TaskTracker列表 |
mapreduce.cluster.job-authorization-enabled |
布尔类型,表示Job存取控制列表是否支持对Job的观察和修改 |
conf/mapred-site.xml配置表
除了规定的端口、IP地址、文件存储位置外,其他配置都是不允许修改的,以上配置被默认为最终参数,这些参数不可以在程序中再次修改。
下一节将详细介绍Hadoop的安装。