1、背景介绍
Hadoop2.0.0之前,在一个HDFS集群中,NameNode存在单节点故障(SPOF):因为集群中只有一个NameNode所以在使用过程中,如果该NameNode出现故障或数据丢失,那么整个集群将瘫痪,故障NameNode节点故障无法恢复,将导致整个集群不能恢复,这也是Hadoop2.0.0之前版本不可靠的表现。
为了解决hadoop2.0.0之前的单点问题,在hadoop2通过在同一个集群上运行两个NameNode的主动/被动配置热备份,这样集群允许在一个NameNode出现故障时转移到另外一个NameNode来保证集群的正常运。两个NameNode有相同的职能。在任何时候,一个是active状态的,一个是standby状态的。当集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了,这就是高可靠。
2、体系结构
在一个典型的HA集群中,需要选择两台单独的机器作为NameNode,并且在任何时候,一个NameNode处于活跃状态,另外一个则处于备用状态;活跃的NameNode负责集群中所有客户端操作,备用节点作为从节点,在活跃节点故障时提供一个快速的故障转移。
为了备用节点能够与活跃节点保持同步,两个节点之间增加了一个守护进程“JournalNodes”(JNS),当任何namespace被活动节点所修改,JNS都会记录edits及相应的操作日志,备用节点会从JNS上读取edits,并将edits中所记录操作应用在自己的namespace,在发生故障时,备用节点将能确保在自己成为活动节点之前通过JNS读取了所有的edits,从而确保namespace在故障转移前是完全同步的。
为了提供一个快速的故障转移,备用节点有必要保存最新的集群中数据块的位置,为了实现这一目的,datanode配置了两个namenode,并给两个namenode发送块的信息及心跳。
需要确保集群中有且仅有一个namenode是活跃的,否则,两个namenode之间的分歧很可能造成数据丢失或其他错误;为了防止该问题的出现,JNS只允许一个namenode(即 active node)存在写权限,在故障转移期间,新的活跃的namenode将接管写权限,这将有效地防止其他NameNode持续处于活跃状态,并允许新的活动节点安全的进行故障转移。
官方说明:http://hadoop.apache.org/docs/r2.7.0/hadoop-project-dist/hadoop-hdfs/HDFSHighAvailabilityWithQJM.html
3、环境介绍
linux系统:CentOS 7.0 (64位)
内存:4G
Hadoop版本:2.7.0(仅供学习使用,暂不建议生产使用)
面向人群:Hadoop初学者
4、Hadoop集群结构说明
4.1 集群结构
IP | 主机名 | Hadoop角色 | Hadoop jps结果 |
---|---|---|---|
192.168.1.130 | hadoop01 | master | NameNode/ResourceManager/JournalNode |
192.168.1.131 | hadoop02 | slaves | DataNode/NodeManager/NameNode/JournalNode |
192.168.1.132 | hadoop03 | slaves | DataNode/NodeManager/JournalNode |
4.2 hosts文件配置
$ vi /etc/hosts
192.168.1.130 hadoop01
192.168.1.131 hadoop02
192.168.1.132 hadoop03
5、Hadoop集群配置
Hadoop需要通过SSH来启动Slave列表中主机的Hadoop守护进程,对于分布式,Hadoop会依次启动/etc/hadoop/savle文件中配置的主机进程。下面的所有操作都在hadoop用户下执行。
5.1、配置SSH免密码登录:
登陆到hadoop01,并在hadoop用户的home目录下执行以下命令:
$ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
(注解:ssh-keygen表示生成密钥;-t指定密钥类型;-P 提供密语;-f生成的密钥文件)
其中:~表示当前目录,此处为/home/hadoop,”单引号之间没有空格。执行命令后,会在在/home/hadoop目录下创建.ssh目录,并在.ssh目录下生成id_dsa及id_dsa.pub 文件。这是SSH的一对私钥和公钥。
把id_dsa.pub(公钥)追加到授权的key中,并修改key的权限
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
将hadoop01的.ssh目录拷贝到hadoop02、hadoop03,并验证是否可以免密码登陆,第一次可能需要输入密码:
[hadoop01@master .ssh]$ ssh hadoop02
Last login: Sat Dec 20 14:53:48 2014 from 192.168.1.130
出现这样的信息,表示SSH配置成功。
注:上述免密码登录是为了方便操作,直接复制.ssh目录,所以三台机子私钥和公钥都一样,从而实现面密码登录;如果三台机器分别生成一对私钥和公钥,则需要将三台机子的公钥分别追加到每台机器的授权key中,并修改key权限。
5.2、Hadoop分布式集群配置:
Hadoop的分布式安装过程非常简单,只需要将Hadoop安装包解压到指定的目录就可以了,接下来对Hadoop的主要配置文件进行配置。
将Hadoop安装包解压到/hadoop 目录下:
$tar –zxvf hadoop-2.7.0.tar.gz -C /hadoop
然后针对/hadoop/hadoop-2.7.0/etc/hadoop目录下几个主要文件进行配置:
hadoop-env.sh、yarn-env.sh 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves
5.2.1、配置hadoop-env.sh
编辑hadoop-env.sh,找到JAVA_HOME指定JDK的安装配置
$vi hadoop-env.sh
export JAVA_HOME=/usr/java/jdk1.6.0_45
5.2.2、配置yarn-env.sh
编辑yarn-env.sh,找到JAVA_HOME指定JDK的安装配置
$vi yarn-env.sh
export JAVA_HOME=/usr/java/jdk1.6.0_45
5.2.3、配置core-site.xml
$vi core-site.xml
<configuration>
<!-- 指定hdfs的name