安装完全分布式Hadoop
1 安装准备工作
本安装示例将使用三台主机(RHEL 5.8 32bit)来实现,其规划如下所示:
IP地址 主机名 运行的进程或扮演的角色
172.16.100.11 master.magedu.com NameNode,JobTracker
172.16.100.12 datanode.magedu.com DataNode,TaskTracker
172.16.100.13 snn.magedu.com SecondaryNameNode
用到的应用程序:
JDK: jdk-7u5-linux-i586.rpm
Hadoop:hadoop-0.20.2-cdh3u5.tar.gz
先在集群中的每个节点上建立运行hadoop进程的用户hadoop并给其设定密码。
# useradd hadoop
# echo "password" | passwd --stdin hadoop
设置集群各节点的/etc/hosts文件内容如下:
172.16.100.11 master.magedu.com master
172.16.100.12 datanode.magedu.com datanode
172.16.100.13 snn.magedu.com snn
而后配置master节点的hadoop用户能够以基于密钥的验正方式登录其它各节点,以便启动进程并执行监控等额外的管理工作。以下命令在master节点上执行即可。
[[email protected] ~]# su - hadoop
[[email protected] ~]$ ssh-keygen -t rsa -P ‘‘
[[email protected] ~]$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]
[[email protected] ~]$ ssh-copy-id -i .ssh/id_rsa.pub [email protected]
2 安装JDK
以下操作需要在每个节点上执行一遍。
编辑 vi /etc/profile.d/java.sh,在文件中添加如下内容:
JAVA_HOME=/usr/java/latest/
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
切换至hadoop用户,并执行如下命令测试jdk环境配置是否就绪。
# su - hadoop
$ java -version
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)
3 安装Hadoop
集群中的每个节点均需要安装Hadoop,以根据配置或需要启动相应的进程等,因此,以下安装过程需要在每个节点上分别执行。
# tar xf hadoop-0.20.2-cdh3u5.tar.gz -C /usr/local
# chown -R hadoop:hadoop /usr/local/hadoop-0.20.2-cdh3u5
# ln -sv /usr/local/hadoop-0.20.2-cdh3u5 /usr/local/hadoop
然后编辑/etc/profile,设定HADOOP_HOME环境变量的值为hadoop的解压目录,并让其永久有效。编辑/etc/profile.d/hadoop.sh,添加如下内容:
HADOOP_HOME=/usr/local/hadoop
PATH=$HADOOP_HOME/bin:$PATH
export HADOOP_BASE PATH
切换至hadoop用户,并执行如下命令测试jdk环境配置是否就绪。
$ hadoop version
Hadoop 0.20.2-cdh3u5
Subversion git://ubuntu-slave02/var/lib/jenkins/workspace/CDH3u5-Full-RC/build/cdh3/hadoop20/0.20.2-cdh3u5/source -r 30233064aaf5f2492bc687d61d72956876102109
Compiled by jenkins on Fri Oct 5 17:21:34 PDT 2012
From source with checksum de1770d69aa93107a133657faa8ef467
4 配置Hadoop
集群中的每个节点上Hadoop的配置均相同,Hadoop在启动时会根据配置文件判定当前节点的角色及所需要运行的进程等,因此,下述的配置文件修改需要在每一个节点上运行。
(1) 修改/usr/local/hadoop/conf/core-site.xml内容如下
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://master.magedu.com:8020</value>
<final>true</final>
<description>The name of the default file system. A URI whose scheme and authority determine the FileSystem implimentation.</description>
</property>
</configuration>
(2)修改/usr/local/hadoop/conf/mapred-site.xml文件为如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>master.magedu.com:8021</value>
<final>true</final>
<description>The host and port that the MapReduce JobTracker runs at. </description>
</property>
</configuration>
(3) 修改/usr/local/hadoop/conf/hdfs-site.xml文件为如下内容
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
<description>The actual number of replications can be specified when the file is created.</description>
</property>
<property>
<name>dfs.data.dir</name>
<value>/hadoop/data</value>
<final>ture</final>
<description>The directories where the datanode stores blocks.</description>
</property>
<property>
<name>dfs.name.dir</name>
<value>/hadoop/name</value>
<final>ture</final>
<description>The directories where the namenode stores its persistent matadata.</description>
</property>
<property>
<name>fs.checkpoint.dir</name>
<value>/hadoop/namesecondary</value>
<final>ture</final>
<description>The directories where the secondarynamenode stores checkpoints.</description>
</property>
</configuration>
说明:根据此配置,需要事先在各节点上创建/hadoop/,并让hadoop用户对其具有全部权限。也可以不指定最后三个属性,让Hadoop为其使用默认位置。
(4)修改/usr/local/hadoop/conf/masters文件,指定SecondaryNameNode节点的主机名或IP地址,本示例中为如下内容:
snn.magedu.com
(5)修改/usr/local/hadoop/conf/slaves文件,指定各DataNode节点的主机名或IP地址,本示例中只有一个DataNode:
datanode.magedu.com
(6)初始化数据节点,在master上执行如下命令
$ hadoop namenode -format
5 启动Hadoop
在master节点上执行Hadoop的start-all.sh脚本即可实现启动整个集群。
[[email protected] ~]$ start-all.sh
其输出内容如下所示:
starting namenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-namenode-master.magedu.com.out
datanode.magedu.com: starting datanode, logging to /usr/local/hadoop/logs/hadoop-hadoop-datanode-datanode.magedu.com.out
snn.magedu.com: starting secondarynamenode, logging to /usr/local/hadoop/logs/hadoop-hadoop-secondarynamenode-node3.magedu.com.out
starting jobtracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-jobtracker-master.magedu.com.out
datanode.magedu.com: starting tasktracker, logging to /usr/local/hadoop/logs/hadoop-hadoop-tasktracker-datanode.magedu.com.out
如果要停止Hadoop的各进程,则使用stop-all.sh脚本即可。
不过,在一个较大规模的集群环境中,NameNode节点需要在内在中维护整个名称空间中的文件和块的元数据信息,因此,其有着较大的内在需求;而在运行着众多MapReduce任务的环境中,JobTracker节点会用到大量的内存和CPU资源,因此,此场景中通常需要将NameNode和JobTracker运行在不同的物理主机上,这也意味着HDFS集群的主从节点与MapReduce的主从节点将分属于不同的拓扑。启动HDFS的主从进程则需要在NameNode节点上使用start-dfs.sh脚本,而启动MapReduce的各进程则需要在JobTracker节点上通过start-mapred.sh脚本进行。这两个脚本事实上都是通过hadoop-daemons.sh脚本来完成进程启动的。
环境设定
5.2内存设定
默认情况下,Hadoop为每个进程分配1000MB(1GB)的内存空间,但这可以在hadoop-env.sh文件中通过HADOOP_HEAPSIZE环境变量进行调整。此外,TaskTracker会为worker主机上的每个map或reduce任务的分别启动一个JVM,这些JVM都需要在进程的HEAP中申请用到内存空间。每个TaskTracker可同时运行的map任务总数和reduce任务总数分别由mapred.tasktracker.map.tasks.maximum和mapred.tasktracker.reduce.tasks.maximum这两个属性进行指定,而它们的默认值都为2。用于运行map或reduce任务的JVM可用内存大小可由mapred.child.java.opts属性指定,其默认设定为-Xmx200m,意指每个任务可以使用最多200MB的内存空间。由此算来,每个worker主机默认将使用2800MB的内存空间。
除了使用mapred.child.java.opts为每个JVM为map任务和reduce任务设定相同可用内存属性之外,还可以使用mapreduce.map.java.opts和mapreduce.reduce.java.opts分别设定map任务和reduce任务的JVM可用内存的属性。
在TaskTracker上可同时运行的任务数取决于其主机的CPU数量。由于MapReduce作业大多为I/O密集型应用,因此,让同行运行任务数多于CPU的个数可以提高资源利用效率,其可以多出的数量取决于实际的作业本身。这里有一个通用法则,即让同行运行的作业数量为CPU数量的1至2之间的数字倍数,比如作业数1.5倍于CPU数。与此同时,一定要注意系统上可用内存的数量是否符合任务数的设定,比如在一个4颗CPU的DataNode上,可以设定mapred.tasktracker.map.tasks.maximum和mapred.tasktrackers.reduce.tasks.maximum属性的值都为3(不是4个,因为datanode和tasktracker都是运行的任务,它们要占去两个名额),假设每个任务的可用内存为400MB,那么这些作业总共需要的内存数为6*400MB,即2.4GB,考虑到操作系统及其它进程所需用的内存等,这个数值可能需要更大。
在hadoop-env.sh文件中,可以使用HADOOP_NAMENODE_OPTS、HADOOP_SECONDARYNAMENODE_OPTS、HADOOP_DATANODE_OPTS、HADOOP_BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量分别为对应的5类进程设定运行参数,比如可以使用HADOOP_NAMENODE_OPTS单独设定namenode进程使用不的HEAPSIZE大小。
5.3 Hadoop日志
Hadoop的系统日志默认存放于其安装目录中的logs子目录,如果需要自定义其存储位置,可以在hadoop-env.sh中设定HADOOP_LOG_DIR环境变量来指定新位置。Hadoop的每个进程均会生成两个日志文件,一个是由log4j生成的并以.log为后缀的日志文件,另一个是以.out为后缀的日志文件,它负责记录发往标准输出和错误输出的信息。
大多数应用的日志住处均发送至.log类的文件中,因此在故障排查时其也是最需要关注的日志文件。然后,Hadoop为log4j提供的默认配置中,其每天会自动做一次日志滚动,并且永远不会删除日志文件,因此,管理员需要手动归档并删除老旧的日志文件。.out类的日志文件中很少出现信息,而且,Hadoop的每次重启都会导致日志自动滚动,并只会保存最至5次的滚动日志文件版本。
除了后缀不同之外,这两种日志文件的名称格式是一样的,默认均为hadoop-<username>-<processname>-<hostname>,比如hadoop-hadoop-namenode-master.magedu.com.log。可以在hadoop-env.sh文件中使用HADOOP_IDENT_STRING变量将日志文件名称格式中的<username>限制为所需要的字符串。
5.4 SSH相关的设定
Hadoop运行时,它利用控制脚本(如start-dfs.sh)在master节点上基于SSH远程管理各worker节点上的进程,因此,为SSH设定合适的参数将用助于Hadoop的健壮性,如合适的连接超时时间(ConnectTimeout)将有助于Hadoop避免被失效的节点阻塞,将StrictHostKeyChecking设定为no将能够使得master自动添加各节点的主机密钥等。
Hadoop的控制脚本可以使用rsync将配置文件同步至集群中的其它节点,默认为禁用。如果需要,可以通过HADOOP_MASTER变量将其启用。不过,由于各点上HADOOP_MASTER默认均为禁用,因此,其第一次配置还是需要其它的方式进行。
其它各SSH相关参数说明及其用法在hadoop-env.sh中均有详细注释,因此,这里不再给出进一步信息。
Hadoop的其它常用属性
5.5 缓冲大小(Buffer size)
Hadoop为其I/O操作使用了4KB的缓冲区容量,这个值是相当保守的。在当今的硬件和操作系统上,可以安全地增大此值以提高系统性能;一般说来,128KB(131072 bytes)是比较理想的设定。如果需要,可以在core-site.xml中通过io.file.buffer.size属性进行定义。
5.6 HDFS块大小
HDFS默认块大小为64MB,然而128MB(134,217,728 bytes)是更常用的设定,甚至有些集群中使用了256MB。较大的块可以有效降低NameNode上的内存压力,并能支持使用更多的数据量。如果需要,可以在hdfs-site.xml文件中使用dfs.block.size属性进行定义。
5.7 慢启动Reduce任务
在一个作业中,默认情况下调度器会在map任务完成5%时开始调度启动当前作业的reduce任务。对于较大的作业来说,过早地启动reduce会导致集群性能的下降。在mapred-site.xml文件中为mapred.reduce.slowstart.completed.maps属性来设定一个更大的值(比如0.8,即80%)可以在更晚的时间点启动reduce作业。