鸿 网 互 联 www.68idc.cn

[置顶] Hadoop2.7.0 HA高可靠性集群搭建

来源:互联网 作者:佚名 时间:2016-06-21 11:37
1、背景介绍 Hadoop2.0.0之前,在一个HDFS集群中,NameNode存在单节点故障(SPOF):因为集群中只有一个NameNode所以在使用过程中,如果该NameNode出现故障或数据丢失,那么整个集群将瘫痪,故障NameNode节点故障无法恢复,将导致整个集群不能恢复,这也是Ha

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的nameservice为cluster -->
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://cluster</value>
    </property>
    <!-- 指定zookeeper地址-->
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
    </property>
    <property>
        <name>ha.zookeeper.session-timeout.ms</name>
        <value>60000</value>
    </property>
    <!-- 故障检查时间 -->
    <property>
        <name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
        <value>60000</value>
    </property>
    <!-- ipc通讯超时时间 -->
    <property>
        <name>ipc.client.connect.timeout</name>
        <value>20000</value>
    </property>
    <!-- 指定hadoop临时目录 -->
    <property>
        <name>hadoop.tmp.dir</name>
        <value>file:/data/hadoop/tmp</value>
    </property>
</configuration>

5.2.4、配置hdfs-site.xml

Hadoop中的HDFS配置,主要配置备份方式,及NameNode、DataNode、NameSecondary存储地址。
$vi hdfs-site.xml

<configuration>
    <!--指定hdfs的nameservice为cluster,需要和core-site.xml中的保持一致 -->
    <property>
        <name>dfs.nameservices</name>
        <value>cluster</value>
    </property>
    <!-- cluster下面有两个NameNode,分别是nn1,nn2 -->
    <property>
        <name>dfs.ha.namenodes.cluster</name>
        <value>nn1,nn2</value>
    </property>
    <!-- nn1、nn2的RPC通信地址 -->
    <property>
        <name>dfs.namenode.rpc-address.cluster.nn1</name>
        <value>hadoop01:9000</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster.nn2</name>
        <value>hadoop02:9000</value>
    </property>
    <!-- nn1、nn2的http通信地址 -->
    <property>
        <name>dfs.namenode.http-address.cluster.nn1</name>
        <value>hadoop01:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster.nn2</name>
        <value>hadoop02:50070</value>
    </property>

    <property>
        <name>dfs.namenode.servicerpc-address.cluster.nn1</name>
        <value>hadoop01:53310</value>
    </property>
    <property>
        <name>dfs.namenode.servicerpc-address.cluster.nn2</name>
        <value>hadoop02:53310</value>
    </property>

    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/cluster
        </value>
    </property>
    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/data/hadoop/journal/data</value>
    </property>
    <!-- 开启NameNode失败自动切换 -->
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>

    <!-- 配置失败自动切换实现方式 -->
    <property>
        <name>dfs.client.failover.proxy.provider.cluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
        </value>
    </property>
    <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>
            sshfence
            shell(/bin/true)
        </value>
    </property>
    <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/home/hadoop/.ssh/id_rsa</value>
    </property>
    <!-- 配置sshfence隔离机制超时时间 -->
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>

    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>dfs.permissions.enable</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.permissions</name>
        <value>false</value>
    </property>
    <property>
        <name>dfs.image.transfer.bandwidthPerSec</name>
        <value>1048576</value>
    </property>

    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.namenode.name.dir</name>
        <value>file:/data/hadoop/dfs/name</value>
    </property>
    <property>
        <name>dfs.datanode.name.dir</name>
        <value>file:/data/hadoop/dfs/data</value>
    </property>
    <property>
        <name>dfs.namenode.checkpoint.dir</name>
        <value>file:/data/hadoop/dfs/namesecondary</value>
    </property>
</configuration>

5.2.5、配置mapred-site.xml

Hadoop的MapReduce框架配置,配置MapReduce框架名称
$vi mapred-site.xml

<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>yarn.app.mapreduce.am.staging-dir</name>
                <value>/tmp/hadoop-yarn/staging</value>
        </property>
</configuration>

5.2.6、配置yarn-site.xml

$vi yarn-site.xml

<configuration>
    <property> 
       <name>yarn.nodemanager.aux-services</name> 
       <value>mapreduce_shuffle</value> 
    </property> 
    <property> 
       <name>yarn.resourcemanager.hostname</name> 
        <value>hadoop01</value> 
    </property> 
</configuration>

5.2.7、配置slaves节点列表

对于分布式安装,该文件中需要配置从节点机器名。

$vi slaves
hadoop02
hadoop03

(注解:slaves节点配置列表,伪分布式配置为:localhost)

5.2.8、配置Hadoop环境变量

这是一个可选步骤,为了方便执行Hadoop命令,可以在hadoop用户的环境变量中添加Hadoop环境变量。切换到hadoop用户的home目录,编辑.bash_profile文件,添加以下内容:
$vi .bash_profile

export  HADOOP_HOME=/hadoop/hadoop-2.7.0
export  HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export  HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export  PATH=$HADOOP_HOME/bin:$PATH

使用source命令,使其立即生效:source .bash_profile,到此,整个Hadoop伪分布式安装完毕,接下来就可以格式HDFS文件系统,并启动Hadoop系统。

5.3、启动集群

5.3.1、启动zookeeper集群

相关知识详见:http://blog.csdn.net/hyx1990/article/details/48225887

5.3.2、启动journalnode集群

在hadoop01上执行如下命令完成JournalNode集群的启动:

$sbin/hadoop-daemons.sh start journalnode

执行jps命令,可以查看到JournalNode的java进程pid;

5.3.3、格式化zkfc

在hadoop01上执行如下命令,完成格式化,让在zookeeper中生成HA节点

hdfs zkfc –formatZK

(注意,这条命令最好手动输入,直接copy执行有可能会有问题,当时部署就跳到坑里半天才出来)
格式成功后,查看zookeeper中可以看到

[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[ns]

5.3.4、格式化hdfs

hadoop namenode –formats

(注意:手动输入命令执行)

5.3.5、启动NameNode

首先在hadoop01上启动active节点,在hadoop01上执行如下命令

$ sbin/hadoop-daemon.sh start namenode

在hadoop02上同步namenode的数据,同时启动standby的namenod,命令如下

#把NameNode的数据同步到hadoop02上
$ hdfs namenode –bootstrapStandby
#启动mhadoop02上的namenode作为standby
$ sbin/hadoop-daemon.sh start namenode

5.3.6、启动datanode

在hadoop01上执行如下命令

$ sbin/hadoop-daemons.sh start datanode

5.3.7、启动YARN

在hadoop01上执行如下命令

$ sbin/start-yarn.sh 

5.3.7、启动ZKFC

在hadoop01上执行如下命令

$ sbin/hadoop-daemons.sh start zkfc

全部启动完后分别在hadoop01、hadoop02、hadoop03上执行jps后进程列表如下:

#hadoop01
3232 JournalNode
3648 NodeManager
3426 DFSZKFailoverController
2660 QuorumPeerMain
2901 NameNode
3014 DataNode
3527 ResourceManager
3816 Jps
#hadoop02
2961 DFSZKFailoverController
2658 NameNode
2517 QuorumPeerMain
3111 Jps
2727 DataNode
2840 JournalNode
3081 NodeManager
#hadoop03
2722 JournalNode
3029 Jps
2518 QuorumPeerMain
2649 DataNode
2863 NodeManager

6、测试HA

正常启动后hadoop01的namenode与hadoop02的namenode状态截图如下:
这里写图片描述

这里写图片描述
此时在hadoop01上执行如下命令关闭namenode

$ sbin/hadoop-daemon.sh stop namenode

再次查看hadoop02上的namenode,发现自动切换为active了,结果如下:
这里写图片描述

网友评论
<