通过 Zookeeper 搭建 Hadoop 高可用完全分布式集群(使用 QJM 方案 )

Hadoop的部署方式有三种:
  单机模式:Hadoop的单机模式安装很简单,只需配置好环境变量即可运行,这个模式一般用来学习和测试Hadoop的功能
  伪分布模式:伪分布式的安装和完全分布式类似,区别是所有角色安装在一台机器上,使用本地磁盘,一般生产环境都会使用完全分布式,伪分布式一般是用来学习和测试Hadoop的功能,伪分布式的配置和完全分布式配置类似
  完全分布式模式:在生产环境中实际使用的安装方式

软件准备:

1.在 Hadoop 官网上下载搭建集群所需软件 Hadoop:

http://hadoop.apache.org

2.在 Zookeeper 官网上下载搭建集群所需软件 Zookeeper:

https://zookeeper.apache.org/releases.html#download

                                                            

正文:

步骤目录:
步骤一:规划拓扑
1.1 NameNode 高可用架构图

步骤二:环境准备
2.1 主机系统环境准备
2.1.1 所有主机安装 CentOS7 系统
2.1.2 关闭所有主机的防火墙和 selinux
2.1.3 配置好所有主机的 yum 源
2.1.4 按照主机列表修改好所有主机的主机名

2.2 软件环境准备(安装 java-1.8.0-openjdk-devel)
2.3 让所有主机可以通过主机名ping通对方
2.4 让NameNode角色的主机,在本次实验中是 nn01 和 nn02 主机能够不用输入密码和 yes 就登陆其他所有 node 主机

步骤三:安装 zookeeper 
3.1 将 zookeeper 解压拷贝到 /usr/local/zookeeper
3.2 配置 zookeeper 文件改名,并在最后添加配置
3.3 拷贝 /usr/local/zookeeper 到其他主机
3.4 在所有主机上创建 mkdir /tmp/zookeeper
3.5 创建 myid 文件,id 必须与配置文件里主机名对应的 server.(id) 一致
3.6 启动服务,单启动一台无法查看状态,需要启动全部主机以后才能查看状态,每一台上面都要手工启动(以nn01为例子)
3.7 查看状态
3.8 利用 api 查看状态

步骤四:搭建 Hadoop 完全分布式前必须要确保的内容
4.1 所有主机都能够 ping 通 namenode 的主机名,namenode 能 ping 通所有节点(在 /etc/hosts 里配置)
4.2 所有主机都要好安装 java-1.8.0-openjdk-devel(可以使用# java -version 命令验证 java-1.8.0-openjdk-devel 是否安装)
4.3 验证 java 角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
4.4 保证 NameNode 主机能够不会出现要求输入 yes 的情况下,成功远程登陆所有主机,包括本机!!!

步骤五:安装并配置 Hadoop
5.1 安装 hadoop
5.1.1 下载 hadoop 安装包
5.1.2 安装hadoop安装包
5.2 总结 HDFS 系统需要修改的配置文件
5.2.1 环境配置文件:hadoop-env.sh
5.2.2 核心配置文件:core-site.xml
5.2.3 HDFS 配置文件:hdfs-site.xml
5.2.4 节点配置文件:slaves
5.2.5 mapred-site.xml
5.2.6 yarn-site.xml
5.3 创建 hadoop 数据的根目录(删除原来的 hadoop 数据如果有的话)
5.4 修改 hadoop-env.sh 文件
5.5 修改 hadoop 的核心配置文件 core-site.xml
5.6 修改 hdfs-site.xml 文件
5.7 修改 yarn-site.xml 文件
5.8 修改 Slaves 文件
5.9 配置 mapred-site
5.10 将 nn01 上配置好的 hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site、slaves 文件以及整个 hadoop 包同步到 nn02、node1、node2、node3
5.11 查看上一步的同步是否成功
5.12 删除所有机器上面的/user/local/hadoop/logs,方便排错

步骤六:验证hadoop的高可用
6.1 初始化
6.1.1 初始化 ZK 集群
6.1.2 在node1,node2,node3上面启动 journalnode 服务
6.1.3 格式化(先在 node1,node2,node3 上面启动 journalnode 之后才能才能格式化)
6.1.4 nn02 数据同步到本地 /var/hadoop/dfs
6.1.5 初始化 JNS
6.1.6 停止 journalnode 服务(node1,node2,node3)
6.2 启动集群
6.2.1 启动 nn01
6.2.2 启动 nn02
6.2.3 查看集群状态
6.2.4 查看节点是否加入
6.3 访问集群
6.3.1 查看并创建
6.3.2 验证高可用,关闭 active namenode
6.3.3 恢复节点

具体的操作步骤:
步骤一:规划拓扑
1.1 NameNode 高可用架构图
ip及主机名        角色             软件
192.168.1.51 NameNode1     Hadoop
nn01

192.168.1.52 NameNode2     Hadoop
nn01

192.168.1.53 DataNode       HDFS
node1        journalNode  Zookeeper
             Zookeeper

192.168.1.54 DataNode       HDFS
node2        journalNode  Zookeeper
             Zookeeper 

192.168.1.55 DataNode       HDFS
node3        journalNode  Zookeeper
             Zookeeper

步骤二:环境准备
2.1 主机系统环境准备
2.1.1 所有主机安装 CentOS7 系统
2.1.2 关闭所有主机的防火墙和 selinux
2.1.3 配置好所有主机的 yum 源
2.1.4 按照主机列表修改好所有主机的主机名

2.2 软件环境准备(安装 java-1.8.0-openjdk-devel)
(只在nn01主机上执行以下命令)
[root@nn01 ~]# for i in {1..5}; do ssh 192.168.1.2$i "yum -y install java-1.8.0-openj

2.3 让所有主机可以通过主机名ping通对方
(只在nn01主机上执行以下命令)
[root@nn01 ~]# vim /etc/hosts
# vim /etc/hosts
::1           localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1       localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.1.21 nn01
192.168.1.22 nn02
192.168.1.23 node1
192.168.1.24 node2
192.168.1.25 node3

[root@nn01 ~]# for i in {1..5}; do scp /etc/hosts 192.168.1.2$i:/etc/hosts; done

2.4 让NameNode角色的主机,在本次实验中是 nn01 和 nn02 主机能够不用输入密码和 yes 就登陆其他所有 node 主机
(只在 nn01 和 nn02 主机上执行以下命令)
# vim /etc/ssh/ssh_config    #让nn01第一次登陆远程主机时不再需要输入yes
Host *
        GSSAPIAuthentication yes
        StrictHostKeyChecking no

# ssh-keygen -b 2048 -t rsa -N '' -f key
# for i in {1..5}; do ssh-copy-id -i ./key.pub 192.168.1.2$i ; done

步骤三:安装 zookeeper 
3.1 将 zookeeper 解压拷贝到 /usr/local/zookeeper
(只在 nn01 主机上执行以下命令)
[root@nn01 ~]# tar -xf zookeeper-3.4.10.tar.gz 
[root@nn01 ~]# mv zookeeper-3.4.10 /usr/local/zookeeper

3.2 配置 zookeeper 文件改名,并在最后添加配置
(只在 nn01 主机上执行以下命令)
[root@nn01 ~]# cd /usr/local/zookeeper/conf/
[root@nn01 conf]# ls
configuration.xsl  log4j.properties  zoo_sample.cfg
[root@nn01 conf]# mv zoo_sample.cfg  zoo.cfg
[root@nn01 conf]# chown root.root zoo.cfg
[root@nn01 conf]# vim zoo.cfg
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=nn01:2888:3888:observer
server.5=nn02:2888:3888:observer

3.3 拷贝 /usr/local/zookeeper 到其他主机
(只在 nn01 主机上执行以下命令)
[root@nn01 conf]# for i in {22..25}; do rsync -aSH --delete /usr/local/zookeeper/ 192.168.1.$i:/usr/local/zookeeper -e 'ssh' & done
[4] 4956
[5] 4957
[6] 4958
[7] 4959

3.4 在所有主机上创建 mkdir /tmp/zookeeper
(只在 nn01 主机上执行以下命令)
[root@nn01 conf]# mkdir /tmp/zookeeper
[root@nn01 conf]# ssh node1 mkdir /tmp/zookeeper
[root@nn01 conf]# ssh node2 mkdir /tmp/zookeeper
[root@nn01 conf]# ssh node3 mkdir /tmp/zookeeper
[root@nn01 conf]# ssh nn02 mkdir /tmp/zookeeper

3.5 创建 myid 文件,id 必须与配置文件里主机名对应的 server.(id) 一致
(只在 nn01 主机上执行以下命令)
[root@nn01 conf]# echo 4 >/tmp/zookeeper/myid
[root@nn01 conf]# ssh node1 'echo 1 >/tmp/zookeeper/myid'
[root@nn01 conf]# ssh node2 'echo 2 >/tmp/zookeeper/myid'
[root@nn01 conf]# ssh node3 'echo 3 >/tmp/zookeeper/myid'
[root@nn01 conf]# ssh nn02 'echo 5 >/tmp/zookeeper/myid'

3.6 启动服务,单启动一台无法查看状态,需要启动全部主机以后才能查看状态,每一台上面都要手工启动(以nn01为例子)
(在 nn01、nn02、node1、node2、node3 主机上执行以下命令)
# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED

注意:刚启动zookeeper查看状态的时候报错,启动的数量要保证半数以上,这时再去看就成功了

3.7 查看状态
(只在 nn01 主机上执行以下命令)
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: observe
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh stop  
#关闭之后查看状态其他服务器的角色
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Stopping zookeeper ... STOPPED

[root@nn01 conf]# yum -y install telnet
[root@nn01 conf]# telnet node3 2181 
Trying 192.168.1.25...
Connected to node3.
Escape character is '^]'.
ruok #发送
imokConnection closed by foreign host. #imok 回应的结果

3.8 利用 api 查看状态
(只在 nn01 主机上执行以下命令)
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh start
[root@nn01 conf]# vim api.sh
#!/bin/bash
function getstatus(){
    exec 9<>/dev/tcp/$1/2181 2>/dev/null
    echo stat >&9
    MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")
    exec 9<&-
    echo ${MODE:-NULL}
}
for i in node{1..5} nn01;do
    echo -ne "${i}\t"
    getstatus ${i}
done

[root@nn01 conf]# chmod 755 api.sh
[root@nn01 conf]# ./api.sh 
node1	follower
node2	leader
node3	follower 
nn01	observer
nn01	observer

步骤四:搭建 Hadoop 完全分布式前必须要确保的内容
4.1 所有主机都能够 ping 通 namenode 的主机名,namenode 能 ping 通所有节点(在 /etc/hosts 里配置)
4.2 所有主机都要好安装 java-1.8.0-openjdk-devel(可以使用# java -version 命令验证 java-1.8.0-openjdk-devel 是否安装)
4.3 验证 java 角色,这个角色是hadoop里的角色(可以用# jps命令验证) 
4.4 保证 NameNode 主机能够不会出现要求输入 yes 的情况下,成功远程登陆所有主机,包括本机!!!
(方法如下:
(1)修改 ssh_config 配置文件
# vim /etc/ssh_config
(在里面修改以下两行)
Host *
        GSSAPIAuthentication yes
        StrictHostKeyChecking no

(2)生成ssh秘钥并将其远程到其他主机
# ssh-keygen -b 2048 -t rsa -N '' -f key
# for i in {21..25} ; do  ssh-copy-id  192.168.1.$i; done   #部署公钥给51到56的主机
)

步骤五:安装并配置 Hadoop
5.1 安装 hadoop
5.1.1 下载 hadoop 安装包
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# tar zxf hadoop-2.7.6.tar.gz #解压安装包
(hadoop安装包可以在本文开头的下载链接上下载)

5.1.2 安装hadoop安装包
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# mv hadoop-2.7.6/* /usr/local/hadoop #安装hadoop
(注意:在执行这一步之前,要先保证 /usr/local/hadoop 目录不存在,这样才会移动并改名,否则的话,就成了将 hadoop-2.7.6 复制在 /usr/local/hadoop 下面)

5.2 总结 HDFS 系统需要修改的配置文件
5.2.1 环境配置文件:hadoop-env.sh
5.2.2 核心配置文件:core-site.xml
5.2.3 HDFS 配置文件:hdfs-site.xml
5.2.4 节点配置文件:slaves
5.2.5 mapred-site.xml
5.2.6 yarn-site.xml

5.3 创建 hadoop 数据的根目录(删除原来的 hadoop 数据如果有的话)
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# mkdir /var/hadoop        //hadoop的数据根目录
[root@nn01 hadoop]# ssh node1 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node2 mkdir /var/hadoop
[root@nn01 hadoop]# ssh node3 mkdir /var/hadoop
[root@nn01 hadoop]# rm -rf /var/hadoop/*
[root@nn01 hadoop]# ssh nn02 rm -rf /var/hadoop/*
[root@nn01 hadoop]# ssh node1 rm -rf /var/hadoop/*
[root@nn01 hadoop]# ssh node2 rm -rf /var/hadoop/*
[root@nn01 hadoop]# ssh node3 rm -rf /var/hadoop/*

5.4 修改 hadoop-env.sh 文件
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim hadoop-env.sh
25 export \ 
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre"
33 export HADOOP_CONF_DIR="/usr/local/hadoop/etc/hadoop"

5.5 修改hadoop的核心配置文件 core-site.xml
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# vim core-site.xml
<configuration>
<property>
        <name>fs.defaultFS</name>
        <value>hdfs://nsdcluster</value> #nsdcluster是随便起的名。相当于一个组,访问的时候访问这个组
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>	//zookeepe的地址
    </property>
    <property>
        <name>hadoop.proxyuser.nfs.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nfs.hosts</name>
        <value>*</value>
    </property>
</configuration>


5.6 修改 hdfs-site.xml 文件
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# vim hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>nsdcluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.nsdcluster</name>				
#nn1,nn2 名称固定,是内置的变量,nsdcluster 里面有 nn1,nn2
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn1</name>		
#声明 nn1 8020 为通讯端口,是 nn01 的 rpc 通讯端口
        <value>nn01:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn2</name>		
#声明 nn2 是谁,nn02 的 rpc 通讯端口
        <value>nn02:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn1</name>	
#nn01 的 http 通讯端口
        <value>nn01:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn2</name> 	
#nn01 和 nn02 的 http 通讯端口
        <value>nn02:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>		
#指定 namenode 元数据存储在 journalnode 中的路径
        <value>qjournal://node1:8485;node2:8485;node3:8485/nsdcluster</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>			
#指定 journalnode 日志文件存储的路径
        <value>/var/hadoop/journal</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.nsdcluster</name>	
#指定 HDFS 客户端连接 active namenode 的 java 类
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>					#配置隔离机制为ssh
        <value>sshfence</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>	#指定密钥的位置
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>		#开启自动故障转移
        <value>true</value>				
    </property>
</configuration>

5.7 修改 yarn-site.xml 文件
(只在 nn01 主机上执行以下命令)
[root@nn01 ~]# vim /usr/local/hadoop/etc/hadoop/yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property> 
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>		#rm1,rm2代表nn01和nn02
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>nn01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>nn02</value>
    </property>
</configuration>


5.8 修改 Slaves 文件
(只在nn01主机上执行以下命令)
[root@nn01 ~]# cd  /usr/local/hadoop/etc/hadoop
[root@nn01 hadoop]# vim slaves
node1
node2
node3

5.9 配置 mapred-site
(只在nn01主机上执行以下命令)
[root@nn01 ~]# cd /usr/local/hadoop/etc/hadoop/
[root@nn01 hadoop]# mv mapred-site.xml.template mapred-site.xml
[root@nn01 hadoop]# vim mapred-site.xml
<configuration>
<property>
        <name>mapreduce.framework.name</name>
        <value>yarn</value>
    </property>
</configuration>

5.10 将 nn01 上配置好的 hadoop-env.sh、core-site.xml、hdfs-site.xml、yarn-site.xml、slaves 文件以及整个 hadoop 包同步到 nn02、node1、node2、node3
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# yum –y install rsync  #同步的主机都要安装rsync
[root@nn01 hadoop]# for i in 52 53 54 55; do rsync -aSH --delete /usr/local/hadoop/ 
\   192.168.1.$i:/usr/local/hadoop/  -e 'ssh' & done
[1] 23260
[2] 23261
[3] 23262
[4] 23263

5.11 查看上一步的同步是否成功
(只在nn01主机上执行以下命令)
[root@nn01 hadoop]# ssh nn02 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

[root@nn01 hadoop]# ssh node1 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

[root@nn01 hadoop]# ssh node2 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

[root@nn01 hadoop]# ssh node3 ls /usr/local/hadoop/
bin
etc
include
lib
libexec
LICENSE.txt
NOTICE.txt
bb
README.txt
sbin
share
aa

5.12 删除所有机器上面的/user/local/hadoop/logs,方便排错
(只在 nn01 主机上执行以下命令)
[root@nn01 ~]# for i in {21..25}; do ssh 192.168.1.$i rm -rf /usr/local/hadoop/logs ; done
[root@nn01 ~]# for i in {22..25}; do rsync -aSH --delete /usr/local/hadoop 192.168.1.$i:/usr/local/hadoop -e 'ssh' & done
[1] 28235
[2] 28236
[3] 28237

步骤六:验证hadoop的高可用
6.1 初始化
6.1.1 初始化 ZK 集群
(只在 nn01 主机上执行以下命令)
[root@nn01 ~]# /usr/local/hadoop/bin/hdfs zkfc -formatZK 
...
18/09/11 15:43:35 INFO ha.ActiveStandbyElector: Successfully created /hadoop-ha/nsdcluster in ZK #出现Successfully即为成功
...

6.1.2 在node1,node2,node3上面启动 journalnode 服务
(分别在 node1、node2 和 node3上 进行操作)
[root@node1 ~]# /usr/local/hadoop/sbin/hadoop-daemon.sh start journalnode 
starting journalnode, logging to /usr/local/hadoop/logs/hadoop-root-journalnode-node1.out
[root@node1 ~]# jps
29262 JournalNode
26895 QuorumPeerMain
29311 Jps

6.1.3 格式化(先在 node1,node2,node3 上面启动 journalnode 之后才能才能格式化)
(分别在 node1、node2 和 node3上 进行操作)
[root@nn01 ~]# /usr/local/hadoop//bin/hdfs  namenode  -format   
#出现Successfully即为成功
[root@nn01 hadoop]# ls /var/hadoop/
dfs

6.1.4 nn02 数据同步到本地 /var/hadoop/dfs
(只在 nn02 主机上执行以下命令)
[root@nn02 ~]# cd /var/hadoop/
[root@nn02 hadoop]# ls
[root@nn02 hadoop]# rsync -aSH  nn01:/var/hadoop/  /var/hadoop/
[root@nn02 hadoop]# ls
dfs

6.1.5 初始化 JNS
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs namenode -initializeSharedEdits
18/09/11 16:26:15 INFO client.QuorumJournalManager: Successfully started new epoch 1	#出现 Successfully,成功开启一个节点

6.1.6 停止 journalnode 服务(node1,node2,node3)
(只在 node1、node2、node3 主机上执行以下命令)
[root@node1 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop journalnode
stopping journalnode
[root@node1 hadoop]# jps
29346 Jps
26895 QuorumPeerMain

6.2 启动集群
6.2.1 启动 nn01
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/sbin/start-all.sh #启动所有集群
This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh
Starting namenodes on [nn01 nn02]
nn01: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-nn01.out
nn02: starting namenode, logging to /usr/local/hadoop/logs/hadoop-root-namenode-nn02.out
node2: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-node2.out
node3: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-node3.out
node1: starting datanode, logging to /usr/local/hadoop/logs/hadoop-root-datanode-node1.out
Starting journal nodes [node1 node2 node3]
node1: starting journalnode, logging to /usr/local/hadoop/logs/hadoop-root-journalnode-node1.out
node3: starting journalnode, logging to /usr/local/hadoop/logs/hadoop-root-journalnode-node3.out
node2: starting journalnode, logging to /usr/local/hadoop/logs/hadoop-root-journalnode-node2.out
Starting ZK Failover Controllers on NN hosts [nn01 nn02]
nn01: starting zkfc, logging to /usr/local/hadoop/logs/hadoop-root-zkfc-nn01.out
nn02: starting zkfc, logging to /usr/local/hadoop/logs/hadoop-root-zkfc-nn02.out
starting yarn daemons
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-nn01.out
node2: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node2.out
node1: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node1.out
node3: starting nodemanager, logging to /usr/local/hadoop/logs/yarn-root-nodemanager-node3.out

6.2.2 启动 nn02
(只在 nn02 主机上执行以下命令)
[root@nn02 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager
starting resourcemanager, logging to /usr/local/hadoop/logs/yarn-root-resourcemanager-nn02.out

6.2.3 查看集群状态
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
active
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2
standby
[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
active
[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2
standby

6.2.4 查看节点是否加入
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs dfsadmin -report
...
Live datanodes (3): #会有三个节点
...
[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn  node  -list
Total Nodes:3
         Node-Id	     Node-State	Node-Http-Address	Number-of-Running-Containers
     node2:43307	        RUNNING	       node2:8042	                           0
     node1:34606	        RUNNING	       node1:8042	                           0
     node3:36749	        RUNNING	       node3:8042	                           0

6.3 访问集群
6.3.1 查看并创建
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hadoop  fs -ls  /
[root@nn01 hadoop]# /usr/local/hadoop/bin/hadoop  fs -mkdir /aa #创建aa
[root@nn01 hadoop]# /usr/local/hadoop/bin/hadoop  fs -ls  / #再次查看

Found 1 items
drwxr-xr-x   - root supergroup          0 2018-09-11 16:54 /aa

[root@nn01 hadoop]# /usr/local/hadoop/bin/hadoop  fs -put *.txt /aa
[root@nn01 hadoop]# /usr/local/hadoop/bin/hadoop  fs -ls hdfs://nsdcluster/aa  
#也可以这样查看
Found 3 items
-rw-r--r--  2 root supergroup 86424 2018-09-11 17:00 hdfs://nsdcluster/aa/LICENSE.txt
-rw-r--r--  2 root supergroup 14978 2018-09-11 17:00 hdfs://nsdcluster/aa/NOTICE.txt
-rw-r--r--  2 root supergroup 1366 2018-09-11 17:00 hdfs://nsdcluster/aa/README.txt

6.3.2 验证高可用,关闭 active namenode
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1
active
[root@nn01 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh stop namenode
stopping namenode
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1      
#再次查看会报错
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn2  
#nn02由之前的standby变为active
active

[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1
active
[root@nn01 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh stop resourcemanager  
#停止resourcemanager 
[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm2
active

6.3.3 恢复节点
(只在 nn01 主机上执行以下命令)
[root@nn01 hadoop]# /usr/local/hadoop/sbin/hadoop-daemon.sh start namenode       
#启动namenode
[root@nn01 hadoop]# /usr/local/hadoop/sbin/yarn-daemon.sh start resourcemanager 
#启动resourcemanager
[root@nn01 hadoop]# /usr/local/hadoop/bin/hdfs haadmin -getServiceState nn1      
#查看
[root@nn01 hadoop]# /usr/local/hadoop/bin/yarn rmadmin -getServiceState rm1      
#查看