Hadoop HA高可用集群的简单安装操作说明

实验环境:本操作说明适合502机房和504机房

一 实验准备:

1)运行Vmware WorkStation或Virtual Box,把“Hadoop伪分布式”虚拟机的名称改成“standby高可用”,“master完全分布式”改成“master高可用”“slave1完全分布式”改成“slave1高可用”,“slave2完全分布式”改成“slave2高可用”

2)启动master完全分布式,slave1完全分布式,slave2完全分布式,standby高可用共4台虚拟机,把standby的IP地址修改成192.168.56.13,修改IP地址方法参见《502机房主机win7系统与Vmare虚拟机Linux系统的网络连接配置操作说明》

3)用XShell远程连接全部4台虚拟机master,slave1,slave2,standy,如果连接不成功,参考《502机房主机win7系统与Vmare虚拟机Linux系统的网络连接配置操作说明》完成网络连接配置,4台虚拟机的IP地址如下:

192.168.56.10 master

192.168.56.11 slave1

192.168.56.12 slave2
192.168.56.13 standy

4)修改standby高可用的主机名为standy

执行vi /etc/hostname  修改主机名为standby,执行hostname查看主机名称,如果没改成standby,执行reboot命令重启一下

二 执行前提实验,安装ZooKeeper集群

在master高可用,slave1高可用,slave2高可用这3台虚拟机上安装ZooKeeper集群并运行,实验步骤参考《ZooKeeper分布式集群简明安装操作说明

三 执行主实验,安装Hadoop HA高可用集群

下面正式开始Hadoop HA高可用集群实验:

实验一 HDFS HA高可用集群搭建实验(实现NameNode HA和主备NameNode 的自动切换)

第1步:先在第1台虚拟机master执行以下操作,再依次在slave1,slave2和standby重复相同的操作:
1)执行命令  vi /etc/hosts   最后4行修改成   
  192.168.56.10 master
  192.168.56.11 slave1
  192.168.56.12 slave2
  192.168.56.13 standby

2)执行命令 vi /etc/profile  检查JAVA_HOME和HADOOP_HOME环境变量是否正确,不正确就要修改正确
#jdk
export JAVA_HOME=/usr/local/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
#hadoop
export HADOOP_HOME=/usr/local/hadoop-2.6.0-cdh5.7.0
export PATH=$PATH:$HADOOP_HOME/bin:$HADOOP_HOME/sbin
还必须执行命令  source /etc/profile   使得环境变量设置生效
依次执行 echo $JAVA_HOME 和 echo $HADOOP_HOME 两个命令,测试环境变量是否生效
3)执行关闭防火墙命令 systemctl disable firewalld   再执行关闭SeLinux命令 setenforce 0

第2步:检查master、slave1,slave2和standby互相之间的SSH免密登录,先在第1个虚拟机master执行以下操作,再依次在slave1,slave2和standby重复相同的操作:
1)执行ssh  master命令,测试能否SSH免密登录master主机,如果能不输入密码自动登录成功,说明SSH免密登录设置成功,登录成功后执行exit退出回话;如果提示需要输入密码,执行ssh-copy-id  master命令,遇到提示输入密码root,把公钥发送到要进行SSH免密登录的目标主机master
2)执行ssh  slave1命令,测试能否SSH免密登录slave1主机,如果能不输入密码自动登录成功,说明SSH免密登录设置成功,登录成功后执行exit退出回话;如果提示需要输入密码,执行ssh-copy-id  slave1,命令,遇到提示输入密码root,把公钥发送到要进行SSH免密登录的目标主机slave1
3)执行ssh  slave2命令,测试能否SSH免密登录slave2主机,如果能不输入密码自动登录成功,说明SSH免密登录设置成功,登录成功后执行exit退出回话;如果提示需要输入密码,执行ssh-copy-id  slave2,命令,遇到提示输入密码root,把公钥发送到要进行SSH免密登录的目标主机slave2
3)执行ssh  standby命令,测试能否SSH免密登录standby主机,如果能不输入密码自动登录成功,说明SSH免密登录设置成功,登录成功后执行exit退出回话;如果提示需要输入密码,执行ssh-copy-id  standby命令,遇到提示输入密码root,把公钥发送到要进行SSH免密登录的目标主机standby
注意:本步骤非常重要,一定要确保4台虚拟机互相之间都能够SSH免密登录成功,一共要测试16次!!!

第3步:重要操作,修改HDFS的配置文件,请注意本步骤只需要在master主机执行即可
1)修改hadoop-env.sh文件
执行cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop  切换到Hadoop配置文件所在路径
执行vi hadoop-env.sh  文件末尾增加以下环境变量:
export JAVA_HOME=/usr/local/java/jdk1.8
export HADOOP_CONF_DIR=/usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop

执行 source hadoop-env.sh   使得环境变量设置生效

2)修改core-site.xml文件
执行cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop  切换到Hadoop配置文件所在路径
执行 vi core-site.xml
删除<configuration> </configuration>之间原有的配置参数,重新增加以下配置参数:
<!-- HDFS集群信息 -->
  <property>
    <name>fs.defaultFS</name>
    <value>hdfs://cluster</value>
  </property>
  <property>
    <name>hadoop.tmp.dir</name>
    <value>/root/hdfs/tmp</value>
  </property>
  <property>
    <name>io.file.buffer.size</name>
    <value>4096</value>
  </property>

  <!-- 配置zookeeper集群 -->
  <property>
    <name>ha.zookeeper.quorum</name>
    <value>master:2181,slave1:2181,slave2:2181</value>
  </property>

3)修改hdfs-site.xml文件
执行cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop  切换到Hadoop配置文件所在路径
执行 vi hdfs-site.xml
删除<configuration> </configuration>之间原有的配置参数,重新增加以下配置参数:
<!-- HDFS集群信息 -->
    <property>
        <name>dfs.nameservices</name>
        <value>cluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.cluster</name>
        <value>node1,node2</value>
    </property>
  <property>
        <name>dfs.namenode.rpc-address.cluster.node1</name>
        <value>standby:9000</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster.node1</name>
        <value>standby:50070</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.cluster.node2</name>
        <value>master:9000</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.cluster.node2</name>
        <value>master:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://master:8485;slave1:8485;slave2:8485/cluster</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/root/hdfs/journal</value>
    </property>
    <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>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.connect-timeout</name>
        <value>30000</value>
    </property>
    <!-- hdfs基础配置 -->
    <property>
        <name>dfs.replication</name>
        <value>3</value>
    </property>
    <property>
        <name>dfs.webhdfs.enabled</name>
        <value>true</value>
    </property>

4)修改slaves文件
执行cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop  切换到Hadoop配置文件所在路径
执行vi slaves 修改为以下三行内容:
master
slave1
slave2

5)将master主机的4个配置文件hadoop-env.sh,core-site.xml,hdfs-site.xml和slaves通过scp远程拷贝到另外3台虚拟机slave1,slave2和standby
先执行scp hadoop-env.sh core-site.xml  hdfs-site.xml slaves [email protected]:/usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop 远程拷贝到slave1
再执行scp hadoop-env.sh core-site.xml  hdfs-site.xml slaves [email protected]:/usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop 远程拷贝到slave2
再执行scp hadoop-env.sh core-site.xml  hdfs-site.xml slaves [email protected]:/usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop 远程拷贝到standby

6)再依次到3台虚拟机slave1,slave2和standby执行以下相同操作:
执行cd /usr/local/hadoop-2.6.0-cdh5.7.0/etc/hadoop  切换到Hadoop配置文件所在路径
执行 source hadoop-env.sh   使得环境变量设置生效

第4步:创建运行Hadoop高可用集群所需的文件目录
先在第一个台虚拟机master执行以下操作,再依次在slave1,slave2和standby重复相同的操作:
1)创建HDFS存放数据的本地目录
a)如果/root/hdfs/tmp目录不存在,执行mkdir -p  /root/hdfs/tmp 创建此路径,如果存在可以跳过此步骤
b)如果/root/hdfs/tmp目录已存在,执行cd /root/hdfs/tmp/ 切换到/root/hdfs/tmp目录,再小心执行删除命令 rm -rf /root/hdfs/tmp/*   删除/root/hdfs/tmp/
下面的所有无效的Hadoop本地文件(因为之前已经安装过完全分布式的Hadoop,现在又重新安装高可用的Hadoop,所以之前的Hadoop本地文件都过期了,必须删除)

2)创建共享存储jounalNode存放元数据的本地目录
执行mkdir -p /root/hdfs/journal 创建jounalNode存放元数据的本地目录
(路径/root/hdfs/journal和配置文件hdfs-site.xml中的dfs.journalnode.edits.dir参数的值必须相同)

第5步:逐步启动Hadoop HA高可用集群

1)首先启动元数据共享存储JournalNode集群
a)在master主机执行命令hadoop-daemons.sh start journalnode 启动JournalNode进程,千万注意只需要在master执行一次即可

b)再依次到master, slave1,slave2依次执行jps命令,3台主机都必须出现以下进程,才说明JournalNode集群启动成功:
[[email protected] ~]# jps
2149 QuorumPeerMain
2535 Jps
2478 JournalNode

[[email protected] ~]# jps
2167 QuorumPeerMain
2332 JournalNode
2399 Jps

[[email protected] ~]# jps
2355 JournalNode
2197 QuorumPeerMain
2422 Jps

2) 然后格式化ZooKeeper,创建高可用机制所需要的ZNode数据节点
a)在master执行 hdfs zkfc -formatZK 命令来格式化zooKeeper,千万注意只需要在master执行一次即可,输出以下提示信息:
20/11/06 23:38:32 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/cluster in ZK.
才表示ZooKeeper格式化成功!

b)执行zkCli.sh命令
进入ZooKeeper Shell终端,查看新生成的hadoop-ha节点及子节点cluster,执行以下命令:
[zk: localhost:2181(CONNECTED) 0] ls /
[zookeeper, hadoop-ha]
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[cluster]
[zk: localhost:2181(CONNECTED) 2] ls /hadoop-ha/cluster
[]
[zk: localhost:2181(CONNECTED) 3] quit

3) 最后格式化分布式文件系统HDFS
在master主机执行HDFS的格式化命令hdfs namenode -format 
输出提示信息20/11/06 23:42:33 INFO common.Storage: Storage directory /root/hdfs/tmp/dfs/name has been successfully formatted. 则说明HDFS格式化成功;注意只需要在master执行一次格式化,千万不要在其他主机重复执行格式化命令

4) 启动Active/Standby(主/备)两个NameNode进程,并对主备NameNode之间的元数据进行同步
a)先在master主机执行命令启动主NameNode进程:hadoop-daemon.sh start namenode(请注意是master主机,本步骤重要必做)
b)再到standby主机下执行命令拷贝元数据到备NameNode:hdfs namenode -bootstrapStandby  (请注意是standby主机,本步骤重要必做,该命令作用是将Active NameNode的 {dfs.namenode.name.dir} 目录内容复制到 StandbyNameNode{dfs.namenode.name.dir} 目录下,实现主备NameNode之间的元数据同步)
输出提示信息20/11/06 23:46:46 INFO common.Storage: Storage directory /root/hdfs/tmp/dfs/name has been successfully formatted.才说明主备NameNode之前的元数据同步成功!!
c)又到standby主机执行命令启动备NameNode:hadoop-daemon.sh start namenode(请注意是standby主机,本步骤必做)

5)终于可以启动整个HDFS HA集群

可以在master或其他任意主机执行命令start-dfs.sh 启动整个HDFS HA集群,启动后4台主机必须出现以下进程才证明HDFS HA集群确实已经启动成功:
[[email protected] ~]# jps
2692 NameNode
2149 QuorumPeerMain
3189 Jps
3143 DFSZKFailoverController
2872 DataNode
2478 JournalNode

[[email protected] ~]# jps
2167 QuorumPeerMain
2332 JournalNode
2557 DataNode
2653 Jps

[[email protected] ~]# jps
2355 JournalNode
2579 DataNode
2675 Jps
2197 QuorumPeerMain

[[email protected] tmp]# jps
3377 DFSZKFailoverController
2616 NameNode
3453 Jps

第5步:查看Active/Standy主备状态
分别访问master和standby各自的Web页面:在Win7使用浏览器分别访问http://192.168.56.10:50070和http://192.168.56.13:50070,查看web页面的两个NameNode的状态信息,应该一个显示为Active,另一个显示为Standby,说明HDFS HA高可用集群安装并运行正常!如图所示:

Hadoop HA高可用集群的简单安装操作说明

Hadoop HA高可用集群的简单安装操作说明

第6步:进行主备NameNode切换测试

测试方法一(简单):
1)如果master主机是Active NameNode,执行以下步骤:
a) 在master主机执行命令hadoop-daemon.sh stop namenode,停止Active状态的NameNode
b)  访问stanby主机的web页面http://192.168.56.13:50070,查看一下界面显示的状态是否切换成了Active
c) 在master主机执行命令hadoop-daemon.sh start namenode,重新启动NameNode进程
d) 访问master主机的web页面http://192.168.56.10:50070,查看一下界面显示的状态是否切换成了Standby
2)如果standby主机是Active NameNode,执行以下步骤:
a) 在standby主机执行命令hadoop-daemon.sh stop namenode,停止Active状态的NameNode
b)  访问master主机的web页面http://192.168.56.10:50070,查看一下界面显示的状态是否切换成了Active
c) 在standby主机执行命令hadoop-daemon.sh start namenode,重新启动NameNode进程
d) 访问standby主机的web页面http://192.168.56.13:50070,查看一下界面显示的状态是否切换成了Standby

实验二 YARN HA高可用集群搭建实验(实现YARN HA和主备ResourceManager的自动切换)