1 安装前的准备工作
环境说明:
四台服务器,均采用CentOS 6.5 (64bit)平台:
服务器:hdnode01,用途:NameNode和JobTraker
服务器:hdnode02-04,用途:DataNode和TaskTraker
JDK: jdk-6u24-linux-x64.rpm
Hadoop:hadoop-2.2.0.tar.gz
其他准备:
- 配置时间同步
- 配置SSH免密码登陆
- 名称解析(我这里默认已配置好dns)
1.1 配置SSH免密码登陆:
为了方便后面的配置,我们先配置SSH免密码登陆,以后所有操作都可以在hdnode01上进行。
1.1.1 配置root的免密码登陆(非必须):
注:这一步我是为了方便后面配置而进行的,并非hadoop需要。但我配置了root免密码登录后,后面可以简化很多配置工作,所有配置都可以只需在一台服务器上进行。
生成key:
[root@hdnode01 ~]# ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
b5:fa:6f:a2:66:04:c7:03:2c:83:c0:5d:79:30:94:88 root@hdnode01.barlow.com
The key's randomart image is:
+--[ RSA 2048]----+
|o.o.+*+ |
| E.ooo+. |
| o.o . |
| . +. . |
| oS.. |
| .. |
| .. |
| o.. . |
| o...+. |
+-----------------+
拷贝至集群其他机器的root对应目录下(我这里用一个for命令批量执行):
[root@hdnode01 ~]# for I in `seq 4` ;do ssh-copy-id -i .ssh/id_rsa.pub hdnode0$I ;done
The authenticity of host 'hdnode02 (172.18.8.202)' can't be established.
RSA key fingerprint is ec:27:5a:8e:c3:5a:a8:b4:4a:8b:91:35:bb:93:33:07.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hdnode02,172.18.8.202' (RSA) to the list of known hosts.
root@hdnode02's password:
Now try logging into the machine, with "ssh 'hdnode02'", and check in:.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
The authenticity of host 'hdnode03 (172.18.8.203)' can't be established.
RSA key fingerprint is ec:27:5a:8e:c3:5a:a8:b4:4a:8b:91:35:bb:93:33:07.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hdnode03,172.18.8.203' (RSA) to the list of known hosts.
root@hdnode03's password:
Now try logging into the machine, with "ssh 'hdnode03'", and check in:.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
The authenticity of host 'hdnode04 (172.18.8.204)' can't be established.
RSA key fingerprint is ec:27:5a:8e:c3:5a:a8:b4:4a:8b:91:35:bb:93:33:07.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'hdnode04,172.18.8.204' (RSA) to the list of known hosts.
root@hdnode04's password:
Now try logging into the machine, with "ssh 'hdnode04'", and check in:.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
测试ssh免密码登陆:
[root@hdnode01 ~]# ssh hdnode02
Last login: Fri Mar 28 20:18:32 2014 from 172.18.8.9
[root@hdnode02 ~]#
配置所有主机的时间同步:
我这里的本地的时间服务器地址为repo.barlow.com,因此所有服务器都与此服务器同步。
[root@hdnode01 ~]# cat /etc/ntp.conf |grep -v "^#" |grep -v "^$"
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server repo.barlow.com
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
启动ntpd服务使其自动更新:
[root@hdnode01 ~]# chkconfig ntpd on
[root@hdnode01 ~]# service ntpd start
Starting ntpd: [ OK ]
将上述配置拷贝至集群所有主机并启动:
[root@hdnode01 ~]# for I in 2 3 4 ;do scp /etc/ntp.conf hdnode0$I:/etc/ntp.conf ;done
ntp.conf 100% 1805 1.8KB/s 00:00
ntp.conf 100% 1805 1.8KB/s 00:00
ntp.conf 100% 1805 1.8KB/s 00:00
[root@hdnode01 ~]# for I in 2 3 4 ;do ssh hdnode0$I chkconfig ntpd on ;done
[root@hdnode01 ~]# for I in 2 3 4 ;do ssh hdnode0$I service ntpd start ;done
Starting ntpd: [ OK ]
Starting ntpd: [ OK ]
Starting ntpd: [ OK ]
1.2 建立hadoop工作账户并配置免密码ssh登录:
安全起见,运行Hadoop需要以普通用户的身份进行,因此,接下来先建立运行hadoop进程的用户hadoop并给其设定密码。
[root@hdnode01 ~]# useradd hadoop
[root@hdnode01 ~]# echo "password" | passwd --stdin hadoop
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
注:上述命令表示建立用户hadoop,并且配置密码为password。
将上述命令批量在集群内其他机器上执行:
[root@hdnode01 ~]# for I in 2 3 4;do ssh hdnode0$I 'useradd hadoop' ;done
[root@hdnode01 ~]# for I in 2 3 4;do ssh hdnode0$I "echo 'password' | passwd --stdin hadoop " ;done
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
Changing password for user hadoop.
passwd: all authentication tokens updated successfully.
建立好账户后先每台都用hadoop用户登录一次:
[root@hdnode01 ~]# for I in 2 3 4;do ssh hadoop@hdnode0$I exit ;done
hadoop@hdnode02's password:
hadoop@hdnode03's password:
hadoop@hdnode04's password:
配置hadoop用户的免密码登录:
[hadoop@hdnode01 ~]$ ssh-keygen -t rsa -P ""
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hadoop/.ssh/id_rsa):
Created directory '/home/hadoop/.ssh'.
Your identification has been saved in /home/hadoop/.ssh/id_rsa.
Your public key has been saved in /home/hadoop/.ssh/id_rsa.pub.
The key fingerprint is:
11:57:1c:13:50:12:da:af:b2:9c:d9:cf:38:44:bf:eb hadoop@hdnode01.barlow.com
The key's randomart image is:
+--[ RSA 2048]----+
| . =**o |
| = ... |
| o . |
| ... |
| S. .. |
| ... |
| ... . |
| . *.o. |
| = o+E. |
+-----------------+[hadoop@hdnode01 ~]$ for I in `seq 4`;do ssh-copy-id -i /home/hadoop/.ssh/id_rsa.pub hadoop@hdnode0$I ;done
注:这里要使用hadoop账户和密码登录。
1.3 安装JDK
jdk其安装过程非常简单,使用类似如下命令即可。
[hadoop@hdnode01 ~]$ for I in 2 3 4;do scp /root/jdk-6u24-linux-x64.rpm hdnode0$I:/usr/local ;done
[hadoop@hdnode01 ~]$ for I in 2 3 4;do ssh hdnode0$I “rpm -ivh jdk-6u24-linux-x64.rpm” ;done
Hadoop运行时需要能访问到如前安装的Java环境,使用rpm安装包会自动配置环境,如果使用二进制安装包,则需手动配置。
切换至hadoop用户,并执行如下命令测试jdk环境配置是否就绪。
[root@hdnode01 usr]# su - hadoop
[hadoop@hdnode01 ~]$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
2 hadoop安装配置
2.1 安装:
拷贝安装程序到每一个节点:
[root@hdnode01 ~]# for I in 2 3 4;do scp hadoop-2.2.0.tar.gz hdnode0$I:/root ;done
hadoop-2.2.0.tar.gz 100% 104MB 34.7MB/s 00:03
hadoop-2.2.0.tar.gz 100% 104MB 34.7MB/s 00:03
hadoop-2.2.0.tar.gz 100% 104MB 34.7MB/s 00:03
解压:
[root@hdnode01 ~]# for I in `seq 4`;do ssh hdnode0$I "tar -xf hadoop-2.2.0.tar.gz -C /usr/local" ;done
[root@hdnode01 ~]# for I in `seq 4`;do ssh hdnode0$I "chown -R hadoop:hadoop /usr/local/hadoop-2.2.0 " ;done
[root@hdnode01 ~]# for I in `seq 4`;do ssh hdnode0$I "ln -sv /usr/local/hadoop-2.2.0 /usr/local/hadoop";done
`/usr/local/hadoop' -> `/usr/local/hadoop-2.2.0'
`/usr/local/hadoop' -> `/usr/local/hadoop-2.2.0'
`/usr/local/hadoop' -> `/usr/local/hadoop-2.2.0'
`/usr/local/hadoop' -> `/usr/local/hadoop-2.2.0'
然后编辑/etc/profile.d/hadoop.sh,设定HADOOP_HOME环境变量的值为hadoop的解压目录,并让其永久有效。添加如下内容:
export HADOOP_BASE=/usr/local/hadoop
export HADOOP_MAPARED_HOME=${HADOOP_BASE}
export HADOOP_COMMON_HOME=${HADOOP_BASE}
export HADOOP_HDFS_HOME=${HADOOP_BASE}
export YARN_HOME=${HADOOP_BASE}
export HADOOP_CONF_DIR=${HADOOP_BASE}/etc/hadoop
export HDFS_CONF_DIR=${HADOOP_BASE}/etc/hadoop
export YARN_CONF_DIR=${HADOOP_BASE}/etc/hadoop
export PATH=$HADOOP_BASE/bin:$HADOOP_BASE/sbin:$PATH
拷贝至其他节点:
[root@hdnode01 ~]# for I in 2 3 4; do scp /etc/profile.d/hadoop.sh hdnode0$I:/etc/profile.d/hadoop.sh ;done
hadoop.sh 100% 85 0.1KB/s 00:00
hadoop.sh 100% 85 0.1KB/s 00:00
hadoop.sh 100% 85 0.1KB/s 00:00
切换至hadoop用户,并执行如下命令测试hadoop是否就绪。
[hadoop@hdnode01 ~]$ hadoop version
Hadoop 2.2.0
Subversion https://svn.apache.org/repos/asf/hadoop/common -r 1529768
Compiled by hortonmu on 2013-10-07T06:28Z
Compiled with protoc 2.5.0
From source with checksum 79e53ce7994d1628b240f09af91e1af4
This command was run using /usr/local/hadoop-2.2.0/share/hadoop/common/hadoop-common-2.2.0.jar
所有节点都检查一次。如果出现上述信息,就表示正常。
2.2 Hadoop的配置文件:
hadoop-env.sh: 用于定义hadoop运行环境相关的配置信息,比如配置JAVA_HOME环境变量、为hadoop的JVM指定特定的选项、指定日志文件所在的目录路径以及master和slave文件的位置等;
core-site.xml: 用于定义系统级别的参数,如HDFS URL、Hadoop的临时目录以及用于rack-aware集群中的配置文件的配置等,此中的参数定义会覆盖core-default.xml文件中的默认配置;
hdfs-site.xml: HDFS的相关设定,如文件副本的个数、块大小及是否使用强制权限等,此中的参数定义会覆盖hdfs-default.xml文件中的默认配置;
mapred-site.xml:HDFS的相关设定,如reduce任务的默认个数、任务所能够使用内存的默认上下限等,此中的参数定义会覆盖mapred-default.xml文件中的默认配置;
masters: hadoop的secondary-masters主机列表,当启动Hadoop时,其会在当前主机上启动NameNode和JobTracker,然后通过SSH连接此文件中的主机以作为备用NameNode;
slaves:Hadoop集群的slave主机列表,master启动时会通过SSH连接至此列表中的所有主机并为其启动DataNode和taskTracker进程;
2.3 Hadoop的分布式模型
Hadoop通常有三种运行模式:本地(独立)模式、伪分布式(Pseudo-distributed)模式和完全分布式(Fully distributed)模式。
安装完成后,Hadoop的默认配置即为本地模式,此时Hadoop使用本地文件系统而非分布式文件系统,而且其也不会启动任何Hadoop守护进程,Map和Reduce任务都作为同一进程的不同部分来执行。因此,本地模式下的Hadoop仅运行于本机。此种模式仅用于开发或调试MapReduce应用程序但却避免了复杂的后续操作。
伪分布式模式下,Hadoop将所有进程运行于同一台主机上,但此时Hadoop将使用分布式文件系统,而且各jobs也是由JobTracker服务管理的独立进程。同时,由于伪分布式的Hadoop集群只有一个节点,因此HDFS的块复制将限制为单个副本,其secondary-master和slave也都将运行于本地主机。此种模式除了并非真正意义的分布式之外,其程序执行逻辑完全类似于完全分布式,因此,常用于开发人员测试程序执行。
要真正发挥Hadoop的威力,就得使用完全分布式模式。由于ZooKeeper实现高可用等依赖于奇数法定数目(an odd-numbered quorum),因此,完全分布式环境需要至少三个节点。
我这里不做伪分布式模式的配置。
2.4 配置Hadoop的完全分布式模式
2.4.1 配置Hadoop
集群中的每个节点上Hadoop的配置均相同,Hadoop在启动时会根据配置文件判定当前节点的角色及所需要运行的进程等,因此,下述的配置文件修改需要在每一个节点上运行。
(1)修改/usr/local/hadoop/etc/hadoop/core-site.xml配置如下:
[hadoop@hdnode01 ~]$ vi /usr/local/hadoop/etc/hadoop/core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://hdnode01.barlow.com:8020</value>
<final>true</final>
<description>The name of the default file system. A URI whose scheme and authority determine the FileSystem hdfs.</description>
</property>
</configuration>
(2)修改/usr/local/hadoop/etc/hadoop/mapred-site.xml配置如下:
[hadoop@hdnode01 ~]$ cp /usr/local/hadoop/etc/hadoop/mapred-site.xml.template /usr/local/hadoop/etc/hadoop/mapred-site.xml
[hadoop@hdnode01 ~]$ vi /usr/local/hadoop/etc/hadoop/mapred-site.xml<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>hdnode01.barlow.com:8021</value>
<final>true</final><description>The host and port that the MapReduce JobTracker runs at. </description>
</property>
</configuration>
(3)配置hdfs:
在所有节点上创建用于挂在hdfs的目录,并修改权限使hadoop用户为其宿主:
[root@hdnode01 ~]# for I in `seq 4`;do ssh hdnode0$I "mkdir /hadoop";ssh hdnode0$I "chown hadoop.hadoop /hadoop";done
对于namenode节点,官方建议最少存放到两个不同的本地磁盘和一个nfs文件系统中以保障安全。我这里仅创建了三个目录用于存放namenode镜像:
[root@hdnode01 ~]# mkdir /hadoop{1,2,3}
[root@hdnode01 ~]# chown –R hadoop.hadoop /hadoop{1,2,3}
修改/usr/local/hadoop/etc/hadoop/hdfs-site.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?><configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>hdnode01.barlow.com:9001</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</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>file:/hadoop1/name,file:/hadoop2/name,file:/hadoop3/name</value>
<final>ture</final>
<description>The directories where the namenode stores its persistent matadata.</description>
</property><property>
<name>fs.checkpoint.dir</name>
<value>file:/hadoop/namesecondary</value>
<final>ture</final>
<description>The directories where the secondarynamenode stores checkpoints.</description>
</property>
</configuration>
(4)修改/usr/local/hadoop/etc/hadoop/yarn-site.xml文件如下:
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property><property>
<name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
<value>org.apache.hadoop.mapred.ShuffleHandler</value>
</property><property>
<name>Yarn.nodemanager.aux-services</name>
<value>mapreduce.shuffle</value>
</property><property>
<name>yarn.resourcemanager.address</name>
<value>hdnode01.barlow.com:8032</value>
</property><property>
<name>yarn.resourcemanager.scheduler.address</name>
<value>hdnode01.barlow.com:8030</value>
</property><property>
<name>yarn.resourcemanager.resource-tracker.address</name>
<value>hdnode01.barlow.com:8031</value>
</property><property>
<name>yarn.resourcemanager.admin.address</name>
<value>hdnode01.barlow.com:8033</value>
</property><property>
<name>yarn.resourcemanager.webapp.address</name>
<value>hdnode01.barlow.com:8088</value>
</property>
</configuration>
(5)修改/usr/local/hadoop/conf/slaves文件,指定各DataNode节点的主机名或IP地址,本示例中有三个DataNode:
[hadoop@hdnode01 ~]$ vi /usr/local/hadoop/etc/hadoop/slaves
hdnode02.barlow.com
hdnode03.barlow.com
hdnode04.barlow.com
(6)修改hadoop-env.sh和yarn-env.sh:
将脚本中JAVA_HOME的定义改为你实际的,如我的修改后为:
#export JAVA_HOME=${JAVA_HOME}
export JAVA_HOME=/usr/local/jdk1.6.0_24
(7)拷贝上述全部配置至所有节点:
[hadoop@hdnode01 ~]$ cd /usr/local/hadoop/etc/hadoop/
[hadoop@hdnode01 hadoop]$ for I in 2 3 4;do scp * hdnode0$I:/usr/local/hadoop/etc/hadoop ;done
(8)初始化数据节点,在master上执行如下命令:
[hadoop@hdnode01 ~]$ hdfs namenode -format
2.5 启动Hadoop:
完成上述工作后,一般就可以正常启动hadoop了,方法如下:
2.5.1 启动hdfs:
第一次启动可以分别启动hdfs、yarn等组件,以方便排错:
[hadoop@hdnode01 ~]$ cd /usr/local/hadoop/sbin/
[hadoop@hdnode01 sbin]$ start-dfs.sh
Starting namenodes on [hdnode01.barlow.com]
hdnode01.barlow.com: starting namenode, logging to /usr/local/hadoop-2.2.0/logs/hadoop-hadoop-namenode-hdnode01.barlow.com.out
hdnode04.barlow.com: starting datanode, logging to /usr/local/hadoop-2.2.0/logs/hadoop-hadoop-datanode-hdnode04.barlow.com.out
hdnode02.barlow.com: starting datanode, logging to /usr/local/hadoop-2.2.0/logs/hadoop-hadoop-datanode-hdnode02.barlow.com.out
hdnode03.barlow.com: starting datanode, logging to /usr/local/hadoop-2.2.0/logs/hadoop-hadoop-datanode-hdnode03.barlow.com.out
Starting secondary namenodes [hdnode01.barlow.com]
hdnode01.barlow.com: starting secondarynamenode, logging to /usr/local/hadoop-2.2.0/logs/hadoop-hadoop-secondarynamenode-hdnode01.barlow.com.out
如果出现上述提示,则表示hdfs正常启动。
在NameNode上查看状态如下:
[hadoop@hdnode01 sbin]$ jps
3598 SecondaryNameNode
3420 NameNode
4059 Jps
在DataNode上查看状态如下:
[hadoop@hdnode03 hadoop]$ jps
3762 DataNode
3802 Jps
查看是否存在错误:
[hadoop@hdnode01 ~]$ grep "ERROR" /usr/local/hadoop/logs/hadoop-hadoop-namenode-hdnode01.barlow.com.log
[hadoop@hdnode01 ~]$ grep "WARN" /usr/local/hadoop/logs/hadoop-hadoop-namenode-hdnode01.barlow.com.log
如果存在错误或警告,请跳转至2.5.3查看相关问题解决
2.5.2 启动其他组件:
一般来说,如果hdfs启动正常,其他组件一般不会存在问题,可用下面命令一键全部启动:
[hadoop@hdnode01 sbin]$ start-all.sh
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [hdnode01.barlow.com]
hdnode01.barlow.com: namenode running as process 41518. Stop it first.
hdnode02.barlow.com: datanode running as process 9512. Stop it first.
hdnode03.barlow.com: datanode running as process 7705. Stop it first.
hdnode04.barlow.com: datanode running as process 6916. Stop it first.
Starting secondary namenodes [hdnode02.barlow.com]
hdnode02.barlow.com: secondarynamenode running as process 9569. Stop it first.
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop-2.2.0/logs/yarn-hadoop-resourcemanager-hdnode01.barlow.com.out
hdnode04.barlow.com: starting nodemanager, logging to /usr/local/hadoop-2.2.0/logs/yarn-hadoop-nodemanager-hdnode04.barlow.com.out
hdnode03.barlow.com: starting nodemanager, logging to /usr/local/hadoop-2.2.0/logs/yarn-hadoop-nodemanager-hdnode03.barlow.com.out
hdnode02.barlow.com: starting nodemanager, logging to /usr/local/hadoop-2.2.0/logs/yarn-hadoop-nodemanager-hdnode02.barlow.com.out
查看主节点:
[hadoop@hdnode01 hadoop]$ jps
42275 Jps
41518 NameNode
3598 SecondaryNameNode
42028 ResourceManager
查看slave节点:
[hadoop@hdnode03 ~]$ jps
7948 Jps
7705 DataNode
7839 NodeManager
正常启动后,也可以通过浏览器查看各节点状态:
查看HDFS的状态:http://hdnode01:50070
查看YARN的状态: http://hdnode01:8088
如下图为查看yarn状态:
如果要停止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脚本来完成进程启动的。
另外,SecondaryNameNode节点也应该单独放到一台服务器,以方便快速恢复。我这里仅用于演示,都放到了hdnode01上。
2.5.3 可能存在的问题及解决办法:
问题点1:报host key错误:
Host key verification failed.
解决办法:
修改/etc/ssh/ssh_config 文件,添加或修改:
StrictHostKeyChecking no
问题点2:报lib加载错误:
14/03/28 20:19:47 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
解决办法:
开启调试,并执行命令测试:
[hadoop@hdnode01 ~]$ export HADOOP_ROOT_LOGGER=DEBUG,console
[hadoop@hdnode01 ~]$ hadoop fs -text /hadoop/name/current/seen_txid
14/03/28 20:28:54 DEBUG util.NativeCodeLoader: Failed to load native-hadoop with error: java.lang.UnsatisfiedLinkError: /usr/local/hadoop-2.2.0/lib/native/libhadoop.so.1.0.0: /usr/local/hadoop-2.2.0/lib/native/libhadoop.so.1.0.0: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)[hadoop@hdnode01 ~]$ file /usr/local/hadoop/lib/native/*
/usr/local/hadoop/lib/native/libhadoop.a: current ar archive
/usr/local/hadoop/lib/native/libhadooppipes.a: current ar archive
/usr/local/hadoop/lib/native/libhadoop.so: symbolic link to `libhadoop.so.1.0.0'
/usr/local/hadoop/lib/native/libhadoop.so.1.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
/usr/local/hadoop/lib/native/libhadoop.so.1.0.0.bak: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
/usr/local/hadoop/lib/native/libhadooputils.a: current ar archive
/usr/local/hadoop/lib/native/libhdfs.a: current ar archive
/usr/local/hadoop/lib/native/libhdfs.so: symbolic link to `libhdfs.so.0.0.0'
/usr/local/hadoop/lib/native/libhdfs.so.0.0.0: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
/usr/local/hadoop/lib/native/libhdfs.so.0.0.0.bak: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
如果出现上述错误,表示该lib文件与当前系统版本不符,lib为32位,而OS为64为,而apache官方社区版提供的二进制安装包只有32位的,因此需要编译,编译过程参考:
CentOS x64编译hadoop,然后用在x64系统下编译好的lib替换原来的lib即可,不想重复编译,可从下面的链接下载我编译好的:hadoop-2.2.0-x64-lib.tar
问题3:hdfs提示只有一个NameNode镜像存储点:
[hadoop@hdnode01 ~]$ grep "WARN" /usr/local/hadoop/logs/hadoop-hadoop-namenode-hdnode01.barlow.com.log
2014-04-05 23:44:15,085 WARN org.apache.hadoop.hdfs.server.namenode.FSNamesystem: Only one image storage directory (dfs.namenode.name.dir) configured. Beware of dataloss due to lack of redundant storage directories!
如果hdfs-site.xml配置文件中,namenode存储位置只配置一个位置,会出现上述提示。hdfs为了安全,建议将namenode镜像存储在三个不同的地方,即两个不同的本地磁盘,一个nas存储。
解决办法:
如下配置后,警告消失:
<property> <name>dfs.namenode.name.dir</name><value>/hadoop1/name,/hadoop2/name,/hadoop3/name</value>
</property>
问题4:hdfs提示如下错误:
[root@hdnode01 logs]# grep "WARN" hadoop-hadoop-namenode-hdnode01.barlow.com.log
2014-04-05 23:44:15,082 WARN org.apache.hadoop.hdfs.server.common.Util: Path /hadoop/name should be specified as a URI in configuration files. Please update hdfs configuration.
解决办法:
新版的hadoop对hdfs的存储路径语法与原来不一样,修改为如下这样即可:
<property>
<name>dfs.name.dir</name>
<value>file:/hadoop1/name,file:/hadoop2/name,file:/hadoop3/name</value>
<final>ture</final>
<description>The directories where the namenode stores its persistent matadata.</description>
</property>
3 Hadoop环境设定
3.1 内存设定
默认情况下,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大小。
3.2 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>限制为所需要的字符串。
3.3 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中均有详细注释,因此,这里不再给出进一步信息。
3.4 Hadoop的其它常用属性
3.4.1 缓冲大小(Buffer size)
Hadoop为其I/O操作使用了4KB的缓冲区容量,这个值是相当保守的。在当今的硬件和操作系统上,可以安全地增大此值以提高系统性能;一般说来,128KB(131072 bytes)是比较理想的设定。如果需要,可以在core-site.xml中通过io.file.buffer.size属性进行定义。
3.4.2 HDFS块大小
HDFS默认块大小为64MB,然而128MB(134,217,728 bytes)是更常用的设定,甚至有些集群中使用了256MB。较大的块可以有效降低NameNode上的内存压力,并能支持使用更多的数据量。如果需要,可以在hdfs-site.xml文件中使用dfs.block.size属性进行定义。
3.4.3 慢启动Reduce任务
在一个作业中,默认情况下调度器会在map任务完成5%时开始调度启动当前作业的reduce任务。对于较大的作业来说,过早地启动reduce会导致集群性能的下降。在mapred-site.xml文件中为mapred.reduce.slowstart.completed.maps属性来设定一个更大的值(比如0.8,即80%)可以在更晚的时间点启动reduce作业。