Hadoop HA 高可用

HA 概述

  1. 所谓 HA(High Availablity),即高可用(7*24 小时不中断服务)
  2. 实现高可用最关键的策略是消除单点故障。HA 严格来说应该分成各个组件的 HA 机制:HDFS-HA 和 YARN-HA
  3. NameNode 主要在以下两个方面影响 HDFS 集群
    • NameNode 机器发生意外,例如宕机,集群将无法使用,直到管理员重启
    • NameNode 机器需要升级,包括软件、硬件升级,此时集群也将无法使用

HDFS HA 功能通过配置多个 NameNodes(Active/Standby)实现在集群中对 NameNode 的热备来解决上述问题。如果出现故障,如机器崩溃或机器需要升级维护,这时可通过此种方式将 NameNode 很快的切换到另外一台机器。

HDFS-HA 集群搭建

当前 HDFS 集群的规划:

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode DataNode SecondaryNameNode、DataNode

HA 的主要目的是消除 NameNode 的单点故障,需要将 hdfs 集群规划成以下模样:

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode NameNode、DataNode NameNode、DataNode

HDFS-HA 核心问题

  1. 怎么保证三台 namenode 的数据一致

    答:

    • Fsimage:让一台 NameNode 生成数据,让其他机器的 NameNode 同步
    • Edits:需要引进新的模块 JournalNode 来保证 edtis 的文件的数据一致性

    相当于其他机器的 NameNode 在主机 NameNode 存活时充当类似于 SecondaryNameNode 的角色。

  2. 怎么让同时只有一台 NameNode 是 active,其他所有的机器的 NameNode 都是 standby 的

    两种策略:

    • 手动分配
    • 自动分配
  3. SecondaryNameNode 在 HA 架构中并不存在,定期合并 fsimage 和 edtis 的活谁来干

    答:由 standby 的 NameNode 来干

  4. 如果 NameNode 真的发生了问题,怎么让其他的 NameNode 上位干活

    • 手动故障转移
    • 自动股炸转移

HDFS-HA 手动模式

环境准备

  1. 修改 IP
  2. 修改主机名及主机名和 IP 地址的映射
  3. 关闭防火墙
  4. ssh 免密登录
  5. 安装 JDK,配置环境变量等

以上步骤在搭建集群时应该已经做过了,主要是检查一下,降低后续出错概率。

规划集群

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode、JournalNode NameNode、DataNode、JournalNode NameNode、DataNode、JournalNode

配置 HDFS-HA 集群

准备工作

建议在搭建 HA 集群时将原本的集群拷贝一份,这样如果搭建失败原本的集群仍可继续使用。

我原本的 Hadoop 位置为:截屏2023-05-17 09.32.34

先拷贝到 ha 目录下:

  • 新建 ha 目录:

    1
    hadoop103@hadoop103:/usr/local$ sudo mkdir ha
  • 修改 ha 目录权限:

    1
    hadoop103@hadoop103:/usr/local$ sudo chown hadoop103:hadoop103 ha
  • 将原集群文件拷贝过来

    1
    hadoop103@hadoop103:/usr/local$ cp -r hadoop/ ha/

这样新的集群文件路径为:截屏2023-05-17 09.37.03

删除 data 和 logs 目录:

1
hadoop103@hadoop103:/usr/local/ha/hadoop$ rm -rf data/ logs/

这一步的效果:截屏2023-05-17 09.39.04

修改配置文件

这里的修改是把原本的配置删除,写入下面的配置

  • core-site.xml

    1
    2
    hadoop103@hadoop103:/usr/local/ha/hadoop$ cd etc/hadoop/
    hadoop103@hadoop103:/usr/local/ha/hadoop/etc/hadoop$ vim core-site.xml

    vim 打开文件后,修改<configuration></configuration>内的内容,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <configuration>
    <!-- 把多个 NameNode 的地址组装成一个集群 myhacluster -->
    <property>
    <name>fs.defaultFS</name>
    <value>hdfs://myhacluster</value>
    </property>

    <!-- 指定 hadoop 运行时产生文件的存储目录 -->
    <property>
    <name>hadoop.tmp.dir</name>
    <value>/usr/local/ha/hadoop/data</value>
    </property>
    </configuration>

    内容写好后按 esc,再输入:wq保存退出。

  • pdfs-site.xml

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop/etc/hadoop$ vim hdfs-site.xml

    vim 打开文件后,修改<configuration></configuration>内的内容,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <configuration>
    <!-- NameNode 数据存储目录 -->
    <property>
    <name>dfs.namenode.name.dir</name>
    <value>file://${hadoop.tmp.dir}/name</value>
    </property>

    <!-- DataNode 数据存储目录 -->
    <property>
    <name>dfs.datanode.data.dir</name>
    <value>file://${hadoop.tmp.dir}/data</value>
    </property>

    <!-- JournalNode 数据存储目录 -->
    <property>
    <name>dfs.journalnode.edits.dir</name>
    <value>${hadoop.tmp.dir}/jn</value>
    </property>

    <!-- 完全分布式集群名称 -->
    <property>
    <name>dfs.nameservices</name>
    <value>myhacluster</value>
    </property>

    <!-- 集群中 NameNode 节点都有哪些 -->
    <property>
    <name>dfs.ha.namenodes.myhacluster</name>
    <value>nn1,nn2,nn3</value>
    </property>

    <!-- NameNode 的 RPC 通信地址 -->
    <property>
    <name>dfs.namenode.rpc-address.myhacluster.nn1</name>
    <value>hadoop103:8020</value>
    </property>
    <property>
    <name>dfs.namenode.rpc-address.myhacluster.nn2</name>
    <value>hadoop104:8020</value>
    </property>
    <property>
    <name>dfs.namenode.rpc-address.myhacluster.nn3</name>
    <value>hadoop105:8020</value>
    </property>

    <!-- NameNode 的 http 通信地址 -->
    <property>
    <name>dfs.namenode.http-address.myhacluster.nn1</name>
    <value>hadoop103:9870</value>
    </property>
    <property>
    <name>dfs.namenode.http-address.myhacluster.nn2</name>
    <value>hadoop104:9870</value>
    </property>
    <property>
    <name>dfs.namenode.http-address.myhacluster.nn3</name>
    <value>hadoop105:9870</value>
    </property>

    <!-- 指定 NameNode 元数据在 JournalNode 上的存放位置 -->
    <property>
    <name>dfs.namenode.shared.edits.dir</name>
    <value>qjournal://hadoop103:8485;hadoop104:8485;hadoop105:8485/myhacluster</value>
    </property>

    <!-- 访问代理类:client 用于确定哪个 NameNode 为 Active -->
    <property>
    <name>dfs.client.failover.proxy.provider.myhacluster</name>
    <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>

    <!-- 关闭检查权限 -->
    <property>
    <name>dfs.permissions</name>
    <value>false</value>
    </property>

    <!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
    <property>
    <name>dfs.ha.fencing.methods</name>
    <value>sshfence</value>
    <value>shell(true)</value>
    </property>

    <!-- 使用隔离机制时需要 ssh 秘钥登录-->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop103/.ssh/id_rsa</value>
    </property>
    </configuration>
分发 ha 目录下的 hadoop 文件
  • 分别在 hadoop104、hadoop105 下创建 ha 目录并修改权限

    hadoop104:

    1
    2
    hadoop104@hadoop104:/usr/local$ sudo mkdir ha
    hadoop104@hadoop104:/usr/local$ sudo chown hadoop104:hadoop104 ha

    hadoop105:

    1
    2
    hadoop105@hadoop105:/usr/local$ sudo mkdir ha
    hadoop105@hadoop105:/usr/local$ sudo chown hadoop105:hadoop105 ha
  • 在 hadoop103 上执行分发脚本命令

    如果你还没有集群分发脚本命令,可参看:集群分发脚本

    1
    hadoop103@hadoop103:/usr/local/ha$ xsync hadoop/

最好再到 hadoop104、hadoop105 查看是否分发成功。

分发成功后有一个地方需要修改:

在 hdfs-site.xml 文件的最后:

1
2
3
4
5
<!-- 使用隔离机制时需要 ssh 秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop103/.ssh/id_rsa</value>
</property>

这里的/home/hadoop103/.ssh/id_rsa需要修改。

  • hadoop104 修改为/home/hadoop104/.ssh/id_rsa
  • hadoop105 修改为/home/hadoop105/.ssh/id_rsa

启动 HDFS-HA 集群

注意,启动前先关闭原本的 hadoop 集群

  1. 先去修改环境变量:

    1
    vim ~/.bashrc

    将 HADOOP_HOME 部分改为如下(其实就是把原本的/usr/local/hadoop 改成/usr/local/ha/hadoop):

    1
    2
    3
    4
    #HADOOP_HOME
    export HADOOP_HOME=/usr/local/ha/hadoop
    export PATH=$PATH:$HADOOP_HOME/bin
    export PATH=$PATH:$HADOOP_HOME/sbin

    内容修改好后按 esc,再输入:wq保存退出。

    环境变量生效:

    1
    source ~/.bashrc

    注意:三台机器都要这样修改,否则集群启动时可能会调用原本集群的配置。

  2. 启动 JournalNode 服务

    hadoop103:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs --daemon start journalnode

    hadoop104:

    1
    hadoop104@hadoop104:/usr/local/ha/hadoop$ hdfs --daemon start journalnode

    hadoop105:

    1
    hadoop105@hadoop105:/usr/local/ha/hadoop$ hdfs --daemon start journalnode

    在初次启动时有这样的警告:

    1
    WARNING: /usr/local/ha/hadoop/logs does not exist. Creating.

    这个不用管它,它说的是没有 logs 文件(本来就还没有,它提示它创建了)

    启动好后检查一下:截屏2023-05-17 10.34.37

  3. 在 nn1 (hadoop103) 上格式化 hadoop,并启动

    1
    2
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs namenode -format
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs --daemon start namenode

    检查一下是否启动:截屏2023-05-17 10.35.50

  4. 在 nn2(hadoop104)和 nn3(hadoop105)上,同步 nn1 的元数据信息

    执行前一定要先启动 nn1——NameNode

    hadoop104:

    1
    hadoop104@hadoop104:/usr/local/ha/hadoop$ hdfs namenode -bootstrapStandby

    hadoop105:

    1
    hadoop105@hadoop105:/usr/local/ha/hadoop$ hdfs namenode -bootstrapStandby
  5. 启动 nn2 和 nn3:

    hadoop104:

    1
    hadoop104@hadoop104:/usr/local/ha/hadoop$ hdfs --daemon start namenode

    hadoop105:

    1
    hadoop105@hadoop105:/usr/local/ha/hadoop$ hdfs --daemon start namenode

    检查是否启动成功:截屏2023-05-17 11.49.38

    如图则成功。

  6. 查看 web 页面

    访问 http://hadoop103:9870http://hadoop104:9870http://hadoop105:9870

    截屏2023-05-17 15.44.55

    截屏2023-05-17 15.45.23

    截屏2023-05-17 15.45.53

    如图可以看出:

    1. hadoop103、hadoop104、hadoop105 都是 standby 的状态。
    2. 可以看到集群名称空间为:myhacluster,是我们想要设置的。
    3. Namenode ID:分别也是 nn1、nn2、nn3。
    4. 同样还有其他信息,可以检查。
  7. 所有服务器启动 datanode

    hadoop103:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs --daemon start datanode

    hadoop104:

    1
    hadoop104@hadoop104:/usr/local/ha/hadoop$ hdfs --daemon start datanode

    hadoop105:

    1
    hadoop105@hadoop105:/usr/local/ha/hadoop$ hdfs --daemon start datanode

    启动后检查是否成功启动:截屏2023-05-17 15.55.20

  8. 将 nn1 切换为 Active

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs haadmin -transitionToActive nn1

    此时查看 hadoop103 的 web 端:http://hadoop103:9870

    截屏2023-05-17 15.56.58

    可以看到状态已经变成 Active 了。

    也可以通过命令查看是否为 Active:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ hdfs haadmin -getServiceState nn1

    结果如图:截屏2023-05-17 15.58.36

    也可验证状态修改成功。

HDFS-HA 自动模式

HDFS- HA 自动故障转移工作机制

自动故障转移为 HDFS 部署增加了两个新组件:ZooKeeper 和 ZKFailoverController(ZKFC)

Zookeeper 集群搭建参看:搭建Zookeeper集群

如图所示:

截屏2023-05-17 16.00.34

ZooKeeper 是维护少量协调数据,通知客户端这些数据的改变和监视客户端故障的高可用服务。

HDFS-HA 自动故障转移的集群配置规划

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode、JournalNodeZookeeperZKFC NameNode、DataNode、JournalNodeZookeeperZKFC NameNode、DataNode、JournalNodeZookeeperZKFC

HDFS-HA 自动故障转移

  1. 修改配置

    注意:一下修改配置都是在原配置文件中添加以下内容。

    • hdfs-site.xml

      1
      2
      3
      4
      5
      <!-- 启用 nn 故障自动转移 -->
      <property>
      <name>dfs.ha.automatic-failover.enabled</name>
      <value>true</value>
      </property>
    • core-site.xml

      1
      2
      3
      4
      5
      <!-- 指定 zkfc 要连接的 zkServer 地址 -->
      <property>
      <name>ha.zookeeper.quorum</name>
      <value>hadoop103:2181,hadoop104:2181,hadoop105:2181</value>
      </property>

    利用分发脚本分发配置:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ xsync etc/hadoop/hdfs-site.xml etc/hadoop/core-site.xml

    hadoop104 和 hadoop105 的 hdfs-site.xml 中需要修改内容:

    1
    2
    3
    4
    5
    <!-- 使用隔离机制时需要 ssh 秘钥登录-->
    <property>
    <name>dfs.ha.fencing.ssh.private-key-files</name>
    <value>/home/hadoop103/.ssh/id_rsa</value>
    </property>

    这里的/home/hadoop103/.ssh/id_rsa需要修改。

    • hadoop104 修改为/home/hadoop104/.ssh/id_rsa
    • hadoop105 修改为/home/hadoop105/.ssh/id_rsa
  2. 启动

    启动前先关闭所有的 HDFS 服务:

    1
    hadoop105@hadoop105:/usr/local/ha/hadoop$ myhadoop stop

    检查是否成功关闭:截屏2023-05-17 16.22.34

    • 启动 Zookeeper 集群

      Zookeeper 集群搭建参看:搭建Zookeeper集群

      1
      hadoop103@hadoop103:~$ zk start

      检查启动状态:截屏2023-05-18 18.09.13

    • 成功启动 Zookeeper 后,再初始化 HA 在 Zookeeper 中的状态:

      1
      hadoop103@hadoop103:~$ hdfs zkfc -formatZK
    • 启动 HDFS 服务:

      1
      hadoop103@hadoop103:~$ start-dfs.sh

      启动后检查一下状态:截屏2023-05-18 18.15.02

    • 去 zkCli(Zookeeper 的客户端)查看 NameNode 选举锁节点的内容:

      1
      hadoop103@hadoop103:~$ $ZOOKEEPER_HOME/bin/zkCli.sh

      客户端中输入 get -s /hadoop-ha/myhacluster/ActiveStandbyElectorLock 查看集群选举状态:

      截屏2023-05-18 18.23.49

      myhaclusternn3 hadoop105 可以看出:选举的 Active 节点是集群中的 nn3 节点,即 hadoop105。

      可分别访问 http://hadoop103:9870、http://hadoop104:9870、http://hadoop105:9870

      检查后的确如此(我这里就不贴图了)。

    • 验证是否可以故障转移

      通过jpsall命令查看所有进程的进程号:

      截屏2023-05-18 18.27.09

      这里可以看到 hadoop105 中的 NameNode 的进程号为:26598。

      结束这个进程(在 hadoop105 中):

      1
      hadoop105@hadoop105:~$ kill -9 26598

      此时 jpsall 查看后 hadoop105 的 NameNode 服务就停止了。再次查看新的 Active 节点是谁(重复上一步的步骤)结果为:

      截屏2023-05-18 18.30.02

      myhaclusternn1 hadoop103 可以看出,新选举出的 Active 节点是集群中的 nn1,即 hadoop103。这样就可以验证自动故障转移成功了。

      当然也可以去 Web 端查看验证:分别访问:http://hadoop103:9870、http://hadoop104:9870、http://hadoop105:9870

      理论情况就是 hadoop103 的状态变为 Active、hadoop104 还是 StandBy、hadoop105 访问不上。

YARN-HA 集群搭建

YARN-HA 核心问题

  • 如果当前 active ResourceManager 挂了,怎么将其他 standby ResourceManager 上位?
    答:核心原理跟 hdfs 一样,利用了 Zookeeper 的临时节点。
  • 当前 ResourceManager 上有很多的计算程序在等待运行,其他的 ResourceManager 怎么将这些程序接手过来接着跑?
    答:ResourceManager 会将当前的所有计算程序的状态存储在 Zookeeper 中,其他 ResourceManager 上位后会去读取,然后接着跑。

YARN-HA 规划集群

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
YARN NodeManager、ResourceManager ResourceManager、NodeManager NodeManager、ResourceManager

YARN-HA 具体配置

在 hadoop103 上修改 yarn-site.xml 文件内容:

1
hadoop103@hadoop103:/usr/local/ha/hadoop/etc/hadoop$ vim yarn-site.xml

将 yarn-site.xml 文件内容修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>

<!-- 启用 resourcemanager ha -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>

<!-- 声明两台 resourcemanager 的地址 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster-yarn1</value>
</property>

<!--指定 resourcemanager 的逻辑列表-->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2,rm3</value>
</property>

<!-- ========== rm1 的配置 ========== -->
<!-- 指定 rm1 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop103</value>
</property>

<!-- 指定 rm1 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>hadoop103:8088</value>
</property>

<!-- 指定 rm1 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm1</name>
<value>hadoop103:8032</value>
</property>

<!-- 指定 AM 向 rm1 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm1</name>
<value>hadoop103:8030</value>
</property>

<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm1</name>
<value>hadoop103:8031</value>
</property>

<!-- ========== rm2 的配置 ========== -->
<!-- 指定 rm2 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop104</value>
</property>

<!-- 指定 rm2 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>hadoop104:8088</value>
</property>

<!-- 指定 rm2 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm2</name>
<value>hadoop104:8032</value>
</property>

<!-- 指定 AM 向 rm2 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm2</name>
<value>hadoop104:8030</value>
</property>

<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm2</name>
<value>hadoop104:8031</value>
</property>

<!-- ========== rm3 的配置 ========== -->
<!-- 指定 rm3 的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm3</name>
<value>hadoop105</value>
</property>

<!-- 指定 rm3 的 web 端地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm3</name>
<value>hadoop105:8088</value>
</property>

<!-- 指定 rm3 的内部通信地址 -->
<property>
<name>yarn.resourcemanager.address.rm3</name>
<value>hadoop105:8032</value>
</property>

<!-- 指定 AM 向 rm3 申请资源的地址 -->
<property>
<name>yarn.resourcemanager.scheduler.address.rm3</name>
<value>hadoop105:8030</value>
</property>

<!-- 指定供 NM 连接的地址 -->
<property>
<name>yarn.resourcemanager.resource-tracker.address.rm3</name>
<value>hadoop105:8031</value>
</property>

<!-- 指定 zookeeper 集群的地址 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop103:2181,hadoop104:2181,hadoop105:2181</value>
</property>

<!-- 启用自动恢复 -->
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>

<!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 -->
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>

<!-- 环境变量的继承 -->
<property>
<name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value>
</property>
</configuration>

esckbd>之后输入:wq保存退出。

将配置文件分发出去:

1
hadoop103@hadoop103:/usr/local/ha/hadoop/etc/hadoop$ xsync yarn-site.xml

启动 YARN

  1. 在 hadoop103 下执行:

    在启动前一定要先启动 Zookeeper 集群

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ start-yarn.sh

    查看启动情况:截屏2023-05-19 13.05.06

  2. 查看服务状态:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ yarn rmadmin -getServiceState rm1

    结果为:standby。

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ yarn rmadmin -getServiceState rm2

    结果为:active。

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ yarn rmadmin -getServiceState rm3

    结果为:standby。

    整体如图:截屏2023-05-19 13.07.52

  3. 去 Zookeeper 客户端查看 ResourceManager 选举锁节点内容:

    1
    hadoop103@hadoop103:/usr/local/ha/hadoop$ $ZOOKEEPER_HOME/bin/zkCli.sh

    输入:get -s /yarn-leader-election/cluster-yarn1/ActiveStandbyElectorLock

    效果如图:截屏2023-05-19 13.11.57

    cluster-yarn1rm2 可以看出:当前 YARN-HA 集群多 Active 节点为 rm2。

  4. web 端查看 YARN 的状态

    访问:http://hadoop103:8088、http://hadoop104:8088、http://hadoop105:8088

总结

两者都搭建好后就是 Hadoop-HA 集群了,即 Hadoop 高可用集群。

搭建好后集群最终效果:

1 号服务器 2 号服务器 3 号服务器
name hadoop103 hadoop104 hadoop105
IP 192.168.64.103 192.168.64.104 192.168.64.105
HDFS NameNode、DataNode、JournalNodeZookeeperZKFC NameNode、DataNode、JournalNodeZookeeperZKFC NameNode、DataNode、JournalNodeZookeeperZKFC
YARN NodeManager、ResourceManager ResourceManager、NodeManager NodeManager、ResourceManager