Hadoop集群部署
网ip | 内网ip | 安装的服务 |
---|---|---|
36.111.36.* | 192.168.0.8 | NameNode、DFSZKFailoverController、ResourceManager、Zookeeper |
36.111.36.* | 192.168.0.9 | NameNode、DFSZKFailoverController、ResourceManager、Zookeeper |
192.168.0.2 | DataNode、NodeManager、JournalNode、Zookeeper | |
192.168.0.3 | DataNode、NodeManager、JournalNode、Zookeeper | |
192.168.0.4 | DataNode、NodeManager、JournalNode、Zookeeper | |
192.168.0.5 | DataNode、NodeManager、JournalNode、Zookeeper | |
192.168.0.6 | DataNode、NodeManager、JournalNode、Zookeeper |
准备工作
配置/etc/hosts
- master1
0.0.0.0 master1
36.111.36.177 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5
- master2
36.111.36.174 master1
0.0.0.0 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5
- slave*
192.168.0.8 master1
192.168.0.10 master2
192.168.0.9 master3
192.168.0.2 slave1
192.168.0.3 slave2
192.168.0.4 slave3
192.168.0.5 slave4
192.168.0.6 slave5
一. 前期配置
1.1 编写集群分发脚本xsync,集群处理脚本xcall
xsync集群分发 脚本
(1)需求:循环复制文件到所有节点的相同目录下
(2)需求分析
①rsync命令原始拷贝:
rsync -av /usr/local/yangguang/software root@hadoop103:/opt/`
②期望脚本:
xsync要同步的文件名称
- ③说明:在/bin这个目录下存放的脚本,用户可以在系统任何地方直接执行。
(3)脚本实现
①在用的家目录/home/root下创建bin文件夹
[atguigu@master1 ~]$ mkdir bin
②在/home/root/bin目录下创建xsync文件,以便全局调用
[atguigu@master1 ~]$ cd /home/root/bin
[atguigu@master1 ~]$ vim xsync
在该文件中编写如下代码
③修改脚本xsync具有执行权限
[atguigu@master1 bin]$ chmod +x xsync
④测试脚本
[atguigu@master1 bin]$ xsync xsync
[atguigu@master1 bin]$ mv xsync /bin
- xcall集群批量处理脚本
[atguigu@master1 bin]$ cd /bin
[atguigu@master1 bin]$ vim xcall
[atguigu@master1 bin]$ chmod +x xcall
1.2 SSH无密登录配置
说明:这里面只配置了master1、master2到其他主机的无密登录;因为master2,master1都要求对其他节点无密访问。
(1)master1上生成公钥和私钥:
[atguigu@master1 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(2)将master1公钥拷贝到要免密登录的目标机器上
[atguigu@master1 .ssh]$ ssh-copy-id master1
[atguigu@master1 .ssh]$ ssh-copy-id master2
[atguigu@master1 .ssh]$ ssh-copy-id slave1
[atguigu@master1 .ssh]$ ssh-copy-id slave2
[atguigu@master1 .ssh]$ ssh-copy-id slave3
[atguigu@master1 .ssh]$ ssh-copy-id slave4
[atguigu@master1 .ssh]$ ssh-copy-id slave5
(3)master2上生成公钥和私钥:
[atguigu@master2 .ssh]$ ssh-keygen -t rsa
然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥)
(4)将hadoop103公钥拷贝到要免密登录的目标机器上
[atguigu@master2 .ssh]$ ssh-copy-id master1
[atguigu@master2 .ssh]$ ssh-copy-id master2
[atguigu@master2 .ssh]$ ssh-copy-id slave1
[atguigu@master2 .ssh]$ ssh-copy-id slave2
[atguigu@master2 .ssh]$ ssh-copy-id slave3
[atguigu@master2 .ssh]$ ssh-copy-id slave4
[atguigu@master2 .ssh]$ ssh-copy-id slave5
1.3 JDK准备
1)卸载现有JDK
[atguigu@master1 opt]# xcall rpm -qa | grep -i java | xargs -n1 sudo rpm -e --nodeps
- (1)rpm -qa:表示查询所有已经安装的软件包
- (2)grep -i:表示过滤时不区分大小写
- (3)xargs -n1:表示一次获取上次执行结果的一个值
- (4)rpm -e –nodeps:表示卸载软件
2)用XShell工具将JDK导入到master2的/usr/local/yangguang/software 文件夹下面
3)在Linux系统下的software目录中查看软件包是否导入成功
[atguigu@master1 software]# ls /usr/local/yangguang/software /
看到如下结果:
jdk-8u212-linux-x64.tar.gz
4)解压JDK到/opt/module目录下
[atguigu@master1 software]# tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/local/yangguang/software/
[atguigu@master1 module]$ mv jdk1.8.0_212/ jdk
5)配置JDK环境变量
- (1)新建/etc/profile.d/my_env.sh文件
[atguigu@master1 module]# sudo vim /etc/profile.d/my_env.sh
添加如下内容,然后保存(:wq)退出
#JAVA_HOME
export JAVA_HOME=/usr/local/yangguang/software/jdk
export PATH=$PATH:$JAVA_HOME/bin
- (2)让环境变量生效
[atguigu@master1 software]$ source /etc/profile.d/my_env.sh
6)测试JDK是否安装成功
[atguigu@master1 module]# java -version
如果能看到以下结果、则Java正常安装
java version "1.8.0_212"
7)分发JDK
[atguigu@master1 module]$ sudo sh /home/atguigu/bin/xsync /usr/local/yangguang/software/jdk
8)分发环境变量配置文件
[atguigu@master1 module]$ sudo sh /home/atguigu/bin/xsync /etc/profile.d/my_env.sh
9)使用xcall上执行source
[atguigu@hadoop103 module]$ xcall source /etc/profile.d/my_env.sh
1.4 环境变量配置说明
Linux的环境变量可在多个文件中配置,如/etc/profile,/etc/profile.d/*.sh,/.bashrc,/.bash_profile等,下面说明上述几个文件之间的关系和区别。
bash的运行模式可分为login shell和non-login shell。
例如,我们通过终端,输入用户名、密码,登录系统之后,得到就是一个login shell。而当我们执行以下命令ssh slave * command,在slave *执行command的就是一个non-login shell。
这两种shell的主要区别在于,它们启动时会加载不同的配置文件,login shell启动时会加载/etc/profile,/.bash_profile,/.bashrc。non-login shell启动时会加载~/.bashrc。
而在加载/.bashrc(实际是/.bashrc中加载的/etc/bashrc)或/etc/profile时,都会执行如下代码片段,
因此不管是login shell还是non-login shell,启动时都会加载/etc/profile.d/*.sh中的环境变量。
二、Zookeeper部署
3.1 什么是Zookeeper
Zookeeper 是一个开源的分布式的,为分布式框架提供协调服务的 Apache 项目。
Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。
3.2 分布式安装部署
3.2.1 集群规划
在所有slave节点上部署Zookeeper。
服务器slave1 | 服务器slave2 | 服务器slave3 | 服务器slave4 | 服务器slave5 | |
---|---|---|---|---|---|
Zookeeper | Zookeeper | Zookeeper | Zookeeper | Zookeeper | Zookeeper |
3.2.2 解压安装
(1)解压Zookeeper安装包到/usr/local/yangguang/software/目录下
[atguigu@master1 software]$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /usr/local/yangguang/software/
(2)修改/usr/local/yangguang/software/apache-zookeeper-3.5.7-bin名称为zookeeper-3.5.7
[atguigu@master1 module]$ mv apache-zookeeper-3.5.7-bin/ zookeeper
3.2.3 配置服务器编号
(1)在/usr/local/yangguang/software/zookeeper/这个目录下创建zkData
[atguigu@master1 zookeeper]$ mkdir zkData
(2)在/usr/local/yangguang/software/zookeeper/zkData目录下创建一个myid的文件
[atguigu@master1 zkData]$ vim myid
添加myid文件,注意一定要在linux里面创建,在notepad++里面很可能乱码
在文件中添加与server对应的编号:
2
3.2.4 配置zoo.cfg文件
(1)重命名/usr/local/yangguang/software/zookeeper-3.5.7/conf这个目录下的zoo_sample.cfg为zoo.cfg
[atguigu@master1 conf]$ mv zoo_sample.cfg zoo.cfg
(2)打开zoo.cfg文件
[atguigu@master1 conf]$ vim zoo.cfg
修改数据存储路径配置
dataDir=/usr/local/yangguang/software/zookeeper/zkData
增加如下配置
(3)同步/usr/local/yangguang/software/zookeeper-3.5.7目录内容到hadoop103、hadoop104
[atguigu@master1 module]$ xsync zookeeper/
(4)分别修改hadoop103、hadoop104上的myid文件中内容为3、4
(5)zoo.cfg配置参数解读
server.A=B:C:D。
A是一个数字,表示这个是第几号服务器;
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
B是这个服务器的地址;
C是这个服务器Follower与集群中的Leader服务器交换信息的端口;
D是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。
3.2.5 集群操作
(1)分别启动Zookeeper
[atguigu@master1 zookeeper]$ xcall bin/zkServer.sh start
(2)查看状态
[atguigu@master1 zookeeper]# xcall bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg
Mode: follower
JMX enabled by default
Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg
Mode: leader
JMX enabled by default
Using config: /usr/local/yangguang/software/zookeeper/bin../image/conf/zoo.cfg
Mode: follower
3.3 ZK集群启动停止脚本
(1)在master1的/home/root/bin目录下创建脚本
[atguigu@master1 bin]$ vim zk.sh
在脚本中编写如下内容
(2)增加脚本执行权限
[atguigu@master1 bin]$ chmod 777 zk.sh
(3)Zookeeper集群启动脚本
[atguigu@master1 module]$ sh zk.sh start
(4)Zookeeper集群停止脚本
[atguigu@master1 module]$ sh zk.sh stop
(5)Zookeeper集群状态脚本
[atguigu@master1 module]$ sh zk.sh status
3.4 客户端命令行操作
命令基本语法 | 功能描述 |
---|---|
help | 显示所有操作命令 |
ls path | 使用 ls 命令来查看当前znode的子节点-w 监听子节点变化-s 附加次级信息 |
create | 普通创建-s 含有序列-e 临时(重启或者超时消失) |
get path | 获得节点的值-w 监听节点内容变化-s 附加次级信息 |
set | 设置节点的具体值 |
stat | 查看节点状态 |
delete | 删除节点 |
deleteall | 递归删除节点 |
1)启动客户端
[atguigu@slave1 zookeeper]$ bin/zkCli.sh
三、安装 Hadoop
3.1 启动服务配置
网ip | 内网ip | 安装的服务 |
---|---|---|
36.111.36.* | 192.168.0.8 | NameNode,DFSZKFailoverController,ResourceManager |
36.111.36.* | 192.168.0.9 | NameNode,DFSZKFailoverController,ResourceManager |
192.168.0.2 | DataNode、NodeManager、JournalNode | |
192.168.0.3 | DataNode、NodeManager、JournalNode | |
192.168.0.4 | DataNode、NodeManager、JournalNode | |
192.168.0.5 | DataNode、NodeManager、JournalNode | |
192.168.0.6 | DataNode、NodeManager、JournalNode |
3.2 配置hadoop-env.sh
文件
[root@master1 ~]# cd /usr/local/yangguang/software/hadoop/etc/hadoop
[root@master1 hadoop]# vi hadoop-env.sh
配置如下:
export JAVA_HOME=/usr/local/yangguang/software/jdk
3.3 配置mapred-env.sh
文件
[root@master hadoop]# vi mapred-env.sh
配置如下:
export JAVA_HOME=/usr/local/yangguang/software/jdk
3.4 配置yarn-env.sh
文件
[root@master hadoop]# vi yarn-env.sh
配置如下:
export JAVA_HOME=/usr/local/yangguang/software/jdk
3.5 配置slaves
文件(该文件下用来配置要启动 NameNode 的机器的 localhost)
[root@master hadoop]# vi slaves
配置如下:
slave1
slave2
slave3
slave4
slave5
3.6 配置core-site.xml
文件
[root@master hadoop]# vi core-site.xml
配置如下:
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://master1:9000</value>
</property>
<!-- hadoop运行时存储路径 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/usr/local/yangguang/software/hadoop/data</value>
</property>
<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
<!-- 配置Zookeeper 管理HDFS -->
<property>
<name>ha.zookeeper.quorum</name> <value>slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
</property>
</configuration>
3.7 配置hdfs-site.xml
文件
[root@master1 hadoop]# vi hdfs-site.xml
配置如下:
<configuration>
<!-- 副本数(正常为3) -->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 命名空间,它的值与fs.defaultFS的值要对应,namenode高可用之后有两个namenode,cluster1是对外提供的统一入口 -->
<property>
<name>dfs.nameservices</name>
<value>cluster1</value>
</property>
<!-- 设置集群中两台NameNode的名称为nn1和nn2 -->
<property>
<name>dfs.ha.namenodes.cluster1</name>
<value>nn1,nn2</value>
</property>
<!-- nn1 rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn1</name>
<value>master1:9000</value>
</property>
<!-- nn2 rpc地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster1.nn2</name>
<value>master2:9000</value>
</property>
<!-- nn1 http地址 -->
<property>
</property>
<!-- nn2 http地址 -->
<property>
<name>dfs.namenode.http-address.cluster1.nn2</name>
<value>master2:50070</value>
</property>
<!-- 启动故障自动恢复 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- journal配置 指定NameNode的edits元数据在JournalNode上的存放位置一般跟zookeeper部署在一起 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://slave1:8485;slave2:8485;slave3:8485;slave4:8485;slave5:8485/cluster1</value>
</property>
<!-- 指定JournalNode集群在对nameNode的目录进行共享时,自己存储数据的磁盘路径 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/usr/local/yangguang/software/hadoop/journaldata/jn</value>
</property>
<!-- namenode高可用主备切换配置 -->
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式,使用内置的zkfc 客户端通过代理访问namenode,访问文件系统,HDFS 客户端与Active 节点通信的Java 类,使用其确定Active 节点
是否活跃-->
<property>
<name>dfs.client.failover.proxy.provider.cluster1</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<!-- 配置隔离机制 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>shell(/bin/true)</value>
</property>
<!-- 使用sshfence隔离机制时需要ssh免登陆 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<!-- 配置sshfence隔离机制超时时间,这个属性同上,如果你是用脚本的方法切换,这个应该是可以不配置的 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
</configuration>
在hadoop260目录下创建JournalNode集群数据存放目录:
[root@master hadoop]# mkdir -p journaldata/jn
3.8 配置mapred-site.xml
文件
[root@master hadoop]# cp mapred-site.xml.template mapred-site.xml
[root@master hadoop]# vi mapred-site.xml
配置如下:
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>master:19888</value>
</property>
</configuration>
3.9 配置yarn-site.xml
文件
[root@master hadoop]# vi yarn-site.xml
配置如下:
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- reducer获取数据方式 -->
<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.log-aggregation-enable</name>
<value>true</value>
</property>
<!-- 日志保留时间设置7天 -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
<!-- 日志聚合HDFS目录 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/data/hadoop/yarn-logs</value>
</property>
<!-- 超时的周期 -->
<property>
<name>yarn.resourcemanager.connect.retry-interval.ms</name>
<value>2000</value>
</property>
<!-- 打开高可用 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 给yarn cluster 取个名字yarn-rm-cluster -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yarn-rm-cluster</value>
</property>
<!-- 给ResourceManager 取个名字 rm1,rm2 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 配置ResourceManager rm1 hostname -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master1</value>
</property>
<!-- 配置ResourceManager rm2 hostname -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>master2</value>
</property>
<!-- 启用resourcemanager 自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<!-- 配置Zookeeper地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>slave1:2181,slave2:2181,slave3:2181,slave4:2181,slave5:2181</value>
</property>
<!--指定resourcemanager的状态信息存储在zookeeper集群,默认是存放在FileSystem里面 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
</configuration>
3.10 配置 hadoop 环境变量文件
[root@master hadoop]# vi /etc/profile.d/my_env.sh
配置如下:
export HADOOP_HOME=/usr/local/yangguang/software/hadoop
export HADOOP_MAPRED_HOME=$HADOOP_HOME
export HADOOP_COMMON_HOME=$HADOOP_HOME
export HADOOP_HDFS_HOME=$HADOOP_HOME
export YARN_HOME=$HADOOP_HOME
export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native
export HADOOP_OPTS="-Djava.library.path=$HADOOP_HOME/lib"
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
3.11 分发 Hadoop 和环境变量文件
[root@master ~]# xsync /usr/local/yangguang/software/hadoop/
[root@master ~]# xsync /etc/profile.d/my_env.sh
[root@master ~]# xcall source /etc/profile.d/my_env.sh
配置没有问题
3.12 启动 hadoop ha 高可用集群一定要按着以下顺序步骤启动集群
!!
①首先使用shell脚本启动zookeeper
[root@master ~]# zk start
②然后启动配置了DataNode的机器上的JournalNode
[root@slave1 ~]# source /etc/profile.d/env.sh
[root@slave1 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out
[root@slave2 ~]# source /etc/profile.d/env.sh
[root@slave2 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out
[root@slave3 ~]# source /etc/profile.d/env.sh
[root@slave3 ~]# hadoop-daemon.sh start journalnode
starting journalnode, logging to /usr/local/yangguang/software/hadoop/logs/hadoop-root-journalnode-slave1.out
③查看journalnode集群
④重置第一台master机器的hdfs
[root@master ~]# hdfs namenode -format
⑤启动master上的NameNode
[root@master ~]# hadoop-daemon.sh start namenode
启动成功
⑥在第二台master2机器上同步第一台master上的NameNode节点信息
[root@master2 ~]# source /etc/profile.d/env.sh
[root@master2 ~]# hdfs namenode -bootstrapStandby
⑦在master机器上重置ZK
[root@master ~]# hdfs zkfc -formatZK
⑧先关掉dfs.sh,然后重新启动
[root@master ~]# stop-dfs.sh
[root@master ~]# start-dfs.sh
查看启动情况,dfs启动成功
⑨在配置了ResourceManager的其中一台机器上启动yarn
[root@master ~]# start-yarn.sh
查看ResourceManager和NodeManager是否启动成功
我们可以看到 master2 上 ResourceManager 没有启动,因为这个需要我们自己手动启动。
启动master2上的ResourceManager
[root@master2 ~]# yarn-daemon.sh start resourcemanager
3.13 测试 hadoop ha 高可用集群
首先打开网页
http://master1:50070
http://master2:50070/
我们可以观察到 master 是 active 的,master2 是 standby 的。
输入测试命令,切换两个NameNode的active
[root@master1 ~]# hdfs haadmin -failover nn1 nn2
刷新网页,我们可以看到 master 变成了 standby 的,master2 变成了 active。
我们再次输入测试命令,切换两个NameNode的active
[root@master1 ~]# hdfs haadmin -failover nn2 nn1
这时我们可以观察到 master 又切换回了 active,master2 又切换成了 standby,所以 NameNode 高可用实现。
接下来测试ResourceManager是否高可用,首先打开网页
http://master1:8088/
http://master2:8088/
我们会发现我们只能打开一个网页,如下:
我们能看到 master 的 ResourceManager 是 active 的。接下来我们 kill 掉 master 的 ResourceManager,重新打开网页看看结果。
这时我们可以看到,master2 上的 ResourceManager 变成了 active,所以 ResourceManager 也高可用。到此,Hadoop ha 高可用机器搭建结束。