Hadoopz安装与配置-集群(2)
安装和配置Hadoop 集群
1 网络拓扑
通常来说,一个Hadoop 的集群体系结构由两层网络拓扑组成,如图2-1 所示。结合实际的应用来看,每个机架中会有30 ~ 40 台机器,这些机器共享一个1GB 带宽的网络交换机。在所有的机架之上还有一个核心交换机或路由器,通常来说其网络交换能力为1GB 或更高。可以很明显地看出,同一个机架中机器节点之间的带宽资源肯定要比不同机架中机器节点间丰富。这也是Hadoop 随后设计数据读写分发策略要考虑的一个重要因素。
2 定义集群拓扑
在实际应用中,为了使Hadoop 集群获得更高的性能,读者需要配置集群使Hadoop 能够感知其所在的网络拓扑结构。当然如果集群中机器数量很少,而且它们存在于一个机架中,那么就不用做太多额外的工作,而当集群中存在多个机架时,就要使Hadoop 清晰地知道每台机器所在的机架。随后,在处理MapReduce 任务时,Hadoop 会优先选择在机架内部进行数据传输,而不是在机架间,这样就可以更充分地使用网络带宽资源。同时,HDFS 可以更加智能地部署数据副本,并在性能和可靠性间寻找到最优的平衡。在Hadoop 中,网络的拓扑结构、机器节点及机架的网络位置定位都是通过树结构来描述的。通过它来确定节点间的距离,这个距离是Hadoop 做决策判断时的参考因素。NameNode 也是通过这个距离来决定应该把数据副本放到哪里的。当一个map 任务到达时,它会被分配到一个TaskTracker 上运行,JobTracker 节点则会使用网络位置来确定map 任务执行的机器节点。在图2-3 中,笔者使用树结构来描述网络拓扑结构,主要包括两个网络位置:交换机/机架1 和交换机/ 机架2。因为在图中的集群只有一个最高级别的交换机,所以此网络拓扑可简化描述为/ 机架1 和/ 机架2。在配置Hadoop 时,Hadoop 会确定节点地址和其网络位置的映射,此映射在代码中通过
Java 接口DNSToSwitchMapping 实现,代码如下:
public interface DNSToSwitchMapping {
public List<String> resolve(List<String> names);
}
其中参数names 是IP 地址的一个List 数据,这个函数返回的值为对应网络位置的字符串列表。在opology.node.switch.mapping.impl 的配置参数中定义了一个DNSToSwitchMapping 接口的实现,NameNode 通过它确定完成任务的机器节点所在的网络位置。在图2-1 的实例中,可以将节点1、节点2、节点3 映射到/ 机架1 中,节点4、节点5、节点6,映射到/ 机架2 中。事实上在实际应用中,管理员可能不需要手动做额外的工作去配置这些映射关系,系统有一个默认的接口实现ScriptBasedMapping。它可以运行用户自定义的一个脚本区完成映射,如果用户没有定义,它则会将所有的机器节点映射到一个单独的网络位置中默认的机架上。如果用户定义了映射,则这个脚本的位置由topology.script.file.name 的属性控制。脚本必须获取一批主机的IP 地址作为参数进行映射,同时生成一个标准的网络位置给输出。
3 建立和安装cluster
想要建立Hadoop 集群,首先要做的就是选择并购买机器,在机器到手之后,就要进行网络部署并安装软件了。安装和配置Hadoop 有很多方法,这一部分内容在前文已经详细讲解(见2.1 节和2.2 节),同时还告诉了读者在实际部署时应该考虑的情况。为了简化我们在每个机器节点上安装和维护相同软件的过程,通常会采用自动安装法,比如Red Hat Linux 下的Kickstart 或Debian 的全程自动化安装。这些工具先会记录你的安装过程,以及你对选择项的选择,然后根据记录来自动安装软件。同时它会在每个进程的结尾提供一个钩子执行脚本,在对那些不包含在标准安装中的最终系统进行调整和自定义时这是非常有用的。下面我们将具体介绍一下如何部署和配置Hadoop。Hadoop 为了应对不同的使用需求(不管是开发、实际应用还是研究),有着不同的运行方式,包括单节点、单机伪分布、集群等。前面已经详细介绍了Hadoop 在Windows 和Linux 平台下的安装与配置。下面将对Hadoop 的分布式配置做具体的介绍。
1. Hadoop 集群的配置
在配置伪分布式的过程中,大家也许会觉得Hadoop 的配置很简单,但那只是最基本的配置。
Hadoop 的配置文件分为两类:
只读类型的默认文件:src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/
mapred/mapred-default.xml、conf/mapred-queues.xml。
定位(site-specific)设置:conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml、
conf/mapred-queues.xml。
除此之外,也可以通过设置conf/Hadoop-env.sh 来为Hadoop 的守护进程设置环境变量(在bin/ 文件夹内)。Hadoop 是通过org.apache.Hadoop.conf.Configuration 来读取配置文件的,在Hadoop 的设置中,Hadoop 的配置是通过资源(resource)定位的,每个资源由一系列name/value 对以XML 文件的形式构成,它以一个字符串命名或以Hadoop 定义的Path 类命名(这个类是用于定义文件系统中的文件或文件夹的)。如果是以字符串命名的,Hadoop 会通过classpath 调用此文件。如果是以Path 类命名的,那么Hadoop 会直接在本地文件系统中搜索文件。资源设定有两个特点,如下所示。Hadoop 允许定义最终参(final parameters),如果任意资源声明了final 这个值,那么之后加载的任何资源都不能改变这个值,定义最终资源的格式是这样的:
<property>
<name>dfs.client.buffer.dir</name>
<value>/tmp/Hadoop/dfs/client</value>
<final>true</final> // 注意这个值
</property>
Hadoop 允许参数传递,如下所示,当tempdir 被调用时,basedir 会作为值被调用。
<property>
<name>basedir</name>
<value>/user/${user.name}</value>
</property>
<property>
<name>tempdir</name>
<value>${basedir}/tmp</value>
</property>
刚才提到,读者可以通过设置conf/Hadoop-env.sh 为Hadoop 的守护进程设置环境变量。一般来说,大家至少需要在这里设置在主机上安装JDK 的位置(JAVA_HOME),以使Hadoop 找到JDK。大家也可以在这里通过HADOOP_*_OPTS 对不同的守护进程分别进行设置,如表2-1 所示。
表2-1 Hadoop 的守护进程配置表
守护进程(Daemon) 配置选项(Configure Options)
NameNode HADOOP_NameNode_OPTS
DataNode HADOOP_DataNode_OPTS
SecondaryNameNode HADOOP_SECONDARYNameNode_OPTS
JobTracker HADOOP_JOBTRACKER_OPTS
TaskTracker HADOOP_TASKTRACKER_OPTS
例如,如果想设置NameNode 使用parallelGC,那么可以这样写:
export HADOOP_NameNode_OPTS="-XX:+UseParallelGC ${HADOOP_NameNode_OPTS}"
在这里也可以进行其他设置,比如设置Java 的运行环境(HADOOP_OPTS),设置日志文
件的存放位置(HADOOP_LOG_DIR),或者SSH 的配置(HADOOP_SSH_OPTS)等。
关于conf/core-site.xml、conf/hdfs-site.xml、conf/mapred-site.xml 的配置可查看表2-2、
表2-3 和表2-4。
表2-2 conf/core-site.xml 的配置
参数(Parameter) 值(Value)
fs.default.name NameNode 的IP 地址及端口
表2-3 conf/hdfs-site.xml 的配置
参数(Parameter) 值(Value)
dfs.name.dir NameNode 存储名字空间及汇报日志的位置
dfs.data.dir DataNode 存储数据块的位置
表2-4 conf/mapred-site.xml 的配置
参数(Parameter) 值(Value)
mapreduce.jobtracker.address JobTracker 的IP 地址及端口
mapreduce.jobtracker.system.dir MapReduce 在HDFS 上存储文件的位置, 例如/Hadoop/
mapred/system/
mapreduce.cluster.local.dir MapReduce 的缓存数据存储在文件系统上的位置
mapred.tasktracker.{map|reduce}.tasks.maximum 每台TaskTracker 所能运行的Map 或Reduce 的task 最大数量
dfs.hosts/dfs.hosts.exclude 允许或禁止的DataNode 列表
mapreduce.jobtracker.hosts.filename/
mapreduce.jobtracker.hosts.exclude.filename 允许或禁止的TaskTrackers 列表
mapreduce.cluster.job-authorization-enabled 布尔类型,标志着job 存取控制列表是否支持对job 的观察和修改
配置并不复杂,一般而言,除了规定端口、IP 地址、文件的存储位置外,其他配置都不是必须修改的,可以根据需要决定是采用默认配置还是自己修改。还有一点需要注意的是,以上配置都被默认为最终参数(final parameters),这些参数都不可以在程序中再次修改。
接下来可以看一下conf/mapred-queues.xml 的配置列表(如表2-5 所示)。
表2-5 conf/mapred-queues.xml 的配置
标签或属性(Tag/Attribute) 值(Value) 是否可刷新
queues 配置文件的根元素无意义
aclsEnabled 布尔类型 <queues> 标签的属性,标志着存取控制列表是否支
持控制job 的提交及所有queues 的管理
是
queue <queues> 的子元素,定义系统中的queue 无意义
name <queue> 的子元素,代表名字否
state <queue> 的子元素,代表queue 的状态是
acl-submit-job <queue> 的子元素,定义一个能提交job 到该queue 的用户或
组的名单列表
是
acl-administer-job <queue> 的子元素,定义一个能更改job 的优先级或能杀死已
提交到该queue 的job 用户或组的名单列表
是
properties <queues> 的子元素,定义优先调度规则无意义
property <properties> 的子元素无意义
key <property> 的子元素调度程序指定
value <property> 的属性调度程序指定
相信大家能猜出上表中的mapred-queues.xml 文件是用来做什么的,这个文件就是用来设置MapReduce 系统的队列顺序的。queues 是JobTracker 中的一个抽象概念,可以在一定程度上管理job,因此它为管理员提供了一种管理job 的方式。这种控制是常见且有效的,例如通过这种管理可以把不同的用户划分为不同的组,或分别赋予他们不同的级别,并且会优先执行高级别用户提交的job。
按照这个思路,很容易想到三种原则:
同一类用户提交的job 统一提交到同一个queue 中;运行时间较长的job 可以提交到同一个queue 中;把很快就能运行完成的job 划分到一个queue 中,并且限制好queue 中job 的数量上限。queues 的有效性很依赖在JobTracker 中通过mapreduce.jobtracker.taskscheduler 设置的调度规则(scheduler),一些调度算法可能只需要一个queue,不过有些调度算法可能会很复杂,需要设置很多queue。queues 的大部分设置的更改都不需要重新启动MapReduce 系统就可以生效,不过也有一些需要重启系统的,具体可见表2-5。conf/mapred-queues.xml 的文件配置与其他文件略有不同,配置格式如下所示:
<queues aclsEnabled="$aclsEnabled">
<queue>
<name>$queue-name</name>
<state>$state</state>
<queue>
<name>$child-queue1</name>
<properties>
<property key="$key" value="$value"/>
...
</properties>
<queue>
<name>$grand-child-queue1</name>
...
</queue>
</queue>
<queue>
<name>$child-queue2</name>
...
</queue>
...
...
...
<queue>
<name>$leaf-queue</name>
<acl-submit-job>$acls</acl-submit-job>
<acl-administer-jobs>$acls</acl-administer-jobs>
<properties>
<property key="$key" value="$value"/>
...
</properties>
</queue>
</queue>
</queues>
以上这些就是Hadoop 配置的主要内容,其他还有一些诸如内存配置方面的信息,如有兴趣可以参阅官方的配置文档。