目录
- 一、hadoop高可用集群部署
-
- 1.hadoop高可用集群简介
- 2.部署说明
- 3.Zookeeper 集群搭建
- 4.hadoop-HA高可用搭建
- 4.故障自动切换
- 二、YARN(资源管理器 RM)高可用集群部署
-
- 1.部署
- 2.故障切换
- 三、HBase高可用集群部署
-
- 1.部署
- 2.故障切换
一、hadoop高可用集群部署
1.hadoop高可用集群简介
- 在典型的 HA 集群中,通常有两台不同的机器充当 NN。在任何时间,只有一台机器处于Active 状态;另一台机器是处于 Standby 状态。Active NN 负责集群中所有客户端的操作;而 Standby NN 主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
- 为了让 Standby NN 的状态和 Active NN 保持同步,即元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active NN 执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby NN 负责观察 edits log的变化,它能够读取从 JNs 中读取 edits 信息,并更新其内部的命名空间。一旦 Active NN出现故障,Standby NN 将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。
- Standby NN 读取全部的 edits 可确保发生故障转移之前,是和 Active NN 拥有完全同步的命名空间状态。
为了提供快速的故障恢复,Standby NN 也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active NN 和 Standby NN 的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
- 在任何时候,集群中只有一个 NN 处于 Active 状态是极其重要的。否则,在两个 Active NN的状态下 NameSpace 状态将会出现分歧,这将会导致数据的丢失及其它不正确的结果。为了保证这种情况不会发生,在任何时间,JNs 只允许一个 NN 充当 writer。在故障恢复期间,将要变成 Active 状态的 NN 将取得 writer 的角色,并阻止另外一个 NN 继续处于 Active状态。
为了部署 HA 集群,需要准备以下事项:
(1)NameNode machines:运行 Active NN 和 Standby NN 的机器需要相同的硬件配置;
(2)JournalNode machines:也就是运行 JN 的机器。JN 守护进程相对来说比较轻量,所以这些守护进程可以可其他守护线程(比如 NN,YARN ResourceManager)运行在同一台机器上。在一个集群中,最少要运行 3 个 JN 守护进程,这将使得系统有一定的容错能力。当然,你也可以运行 3 个以上的 JN,但是为了增加系统的容错能力,你应该运行奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。
- 在 HA 集群中,Standby NN 也执行 namespace 状态的 checkpoints,所以不必要运行Secondary NN、CheckpointNode 和 BackupNode;事实上,运行这些守护进程是错误的。
2.部署说明
实验准备五台虚拟机,准备Zookeeper的压缩包。
server7/8/10 搭建ZK集群、JN集群、DN集群;
server9/6 搭建NN高可用。
虚拟机ip | 主机名 | 角色 |
---|---|---|
172.25.36.9 | server9 | NameNode、ResourceManager、DFSZKFailoverController |
172.25.36.6 | server6 | NameNode、ResourceManager、DFSZKFailoverController |
172.25.36.7 | server7 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
172.25.36.8 | server8 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
172.25.36.10 | server10 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
3.Zookeeper 集群搭建
server9首先执行脚本,停止hadoop;
jps查看没有任何进程了
清除默认的数据目录(server9/7/8/10的 tmp目录内hadoop配置文件)
server6安装nfs
server6创建hadoop用户;
将共享的目录挂载到自己的/home/hadoop,切入hadoop用户
真机将提前下载好的Zookeeper 压缩包传给server9
server9解压Zookeeper ,由于是nfs系统全部节点都可共用
server7进入zookeeper-3.4.9/conf,复制一份配置文件,命名为zoo.cfg 文件
编辑 zoo.cfg 文件;
创建/tmp/zookeeper目录,存放zk集群信息
加入三个zk节点的ip,这里172.25.36.7 在zk集群中编号为1,172.25.36.8 在zk集群中编号为2,172.25.36.10 在zk集群中编号为3;
2888端口是用来数据同步的,3888端口是用来选举leader的
根据每个节点自己的编号,把编号写入/tmp/zookeeper/myid,server7写1
server8写2
server10写3
server7进入zookeeper-3.4.9,开启zkserver
在server8启动服务
在server10启动服务
启动之后,依次查看各节点的状态,server7状态为follower
server8状态为server7状态为leader(随机选举的身份,只有一个leader)
server10状态为follower
执行以下命令
此时里面还没有数据
三个DN节点(ZK集群)的状态如下
4.hadoop-HA高可用搭建
server9编辑/home/hadoop/etc/hadoop/core-site.xml文件
<configuration>
<property><name>fs.defaultFS</name> %指定 hdfs 的 namenode 为 masters (名称可自定义,前后要一致)<value>hdfs://masters</value>
</property><property><name>ha.zookeeper.quorum</name> %指定 zookeeper 集群主机地址<value>172.25.36.7:2181,172.25.36.8:2181,172.25.36.10:2181</value>
</property>
</configuration>
1
编辑etc/hadoop/hdfs-site.xml 文件
[hadoop@server9 hadoop]$ cat hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!--Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. See accompanying LICENSE file.
--><!-- Put site-specific property overrides in this file. --><configuration><property> %副本数为3<name>dfs.replication</name><value>3</value></property><property> %指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致<name>dfs.nameservices</name><value>masters</value></property><property> %masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义)<name>dfs.ha.namenodes.masters</name><value>h1,h2</value></property><property> %指定 h1 节点的 rpc 通信地址<name>dfs.namenode.rpc-address.masters.h1</name><value>172.25.36.9:9000</value></property><property> %指定 h1 节点的 http 通信地址<name>dfs.namenode.http-address.masters.h1</name><value>172.25.36.9:9870</value></property><property> %指定 h2 节点的 rpc 通信地址<name>dfs.namenode.rpc-address.masters.h2</name><value>172.25.36.6:9000</value></property><property> %指定 h2 节点的 http 通信地址<name>dfs.namenode.http-address.masters.h2</name><value>172.25.36.6:9870</value></property><property> %指定 NameNode 元数据在 JournalNode 上的存放位置<name>dfs.namenode.shared.edits.dir</name><value>qjournal://172.25.36.7:8485;172.25.36.8:8485;172.25.36.10:8485/masters</value></property><property> %指定 JournalNode 在本地磁盘存放数据的位置<name>dfs.journalnode.edits.dir</name><value>/tmp/journaldata</value></property><property> %开启 NameNode 失败自动切换<name>dfs.ha.automatic-failover.enabled</name><value>true</value></property><property> %配置失败自动切换实现方式<name>dfs.client.failover.proxy.provider.masters</name><value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value></property><property> %配置隔离机制方法,每个机制占用一行<name>dfs.ha.fencing.methods</name><value>sshfenceshell(/bin/true)</value></property><property> %使用 sshfence 隔离机制时需要 ssh 免密码<name>dfs.ha.fencing.ssh.private-key-files</name><value>/home/hadoop/.ssh/id_rsa</value></property><property> %配置 sshfence 隔离机制超时时间<name>dfs.ha.fencing.ssh.connect-timeout</name><value>30000</value></property>
</configuration>
在三个DN (server7/8/10) 上开启journalnode,第一次启动 hdfs 必须先手动启动 journalnode(按照编号顺序依次开启)
查看jps进程,可以看到都开启了 JournalNode
server9进入hadoop目录,格式化 HDFS 集群
Namenode 数据默认存放在/tmp,server9需要把数据拷贝到 server6
server9和server6进行免密
server9格式化 zookeeper (只需在 h1 上执行即可)
此时,server7进入zk,作为一个查询的窗口,不要退出
可以查看到DFS虚拟目录(不要退出)
server9启动dfs(这个脚本也带有日志节点的启动)
jps可以查看到DFSZKFailoverController(zk控制器)
此时,返回server7查看,现在的主机为server9,备机为server6
访问172.25.36.9:9870,可以看到server9为active
访问172.25.36.6:9870,可以看到server6为standby
server9创建hadoop用户目录,上传input目录到DFS
访问172.25.36.9:9870,可以看到上传的文件
4.故障自动切换
现在关闭 server9的NameNode进程
在server7查看,现在server6接替任务了
因此访问172.25.36.9:9870就失败了,因此进程已经被kill了;
现在需要访问172.25.36.6:9870,三个DN状态正常
现在server6是active
server9查看input也在,没有异常
想要恢复server9也很简单,只要开启server9节点即可
不过现在server6依然是active,因为没有必要切换,浪费资源
现在可以访问172.25.36.9:9870可以了,但是server9是standby
二、YARN(资源管理器 RM)高可用集群部署
1.部署
编辑yarn-site.xml 文件
[hadoop@server9 hadoop]$ cat yarn-site.xml
<?xml version="1.0"?>
<!--Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. See accompanying LICENSE file.
-->
<configuration><property> %配置可以在 nodemanager 上运行 mapreduce 程序<name>yarn.nodemanager.aux-services</name><value>mapreduce_shuffle</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_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME</value></property><property> %激活 RM 高可用<name>yarn.resourcemanager.ha.enabled</name><value>true</value></property><property> %指定 RM 的集群 id<name>yarn.resourcemanager.cluster-id</name><value>RM_CLUSTER</value></property><property> %定义 RM 的节点<name>yarn.resourcemanager.ha.rm-ids</name><value>rm1,rm2</value></property><property> %指定 RM1 的地址<name>yarn.resourcemanager.hostname.rm1</name><value>172.25.36.9</value></property><property> %指定 RM2 的地址<name>yarn.resourcemanager.hostname.rm2</name><value>172.25.36.6</value></property><property> %激活 RM 自动恢复<name>yarn.resourcemanager.recovery.enabled</name><value>true</value></property><property> %配置 RM 状态信息存储方式,有 MemStore 和 ZKStore<name>yarn.resourcemanager.store.class</name><value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><property> %配置为 zookeeper 存储时,指定 zookeeper 集群的地址<name>yarn.resourcemanager.zk-address</name><value>172.25.36.7:2181,172.25.36.8:2181,172.25.36.10:2181</value></property>
</configuration>
server9开启yarn,jps查看出现ResourceManager
server6,jps查看出现ResourceManager
server7/8/10,jps查看出现NodeManager
在server7查看,RM现在rm1是active
访问172.25.36.9:8088,可以看到是active
访问172.25.36.9:8088,可以看到是standby
2.故障切换
杀掉server9的RM
server7查看,rm2(server5)自动接管active
访问172.25.36.6:8088,可以看到是active
当然访问172.25.36.9:8088失败,恢复也很简单,server9开启RM
但是server9现在是standby,因为没有必要浪费资源切换
三、HBase高可用集群部署
1.部署
server9进行hbase 配置,解压hbase压缩包
tar zxf hbase-1.2.4-bin.tar.gz
配置hbase环境变量,加入java、hadoop路径,vim ~/hbase-1.2.4/conf/hbase-env.sh
由于已经配置好zk集群,因此不采用hbase自带的zk ,设置为false
配置 regionservers 文件,加入集群节点
[hadoop@server9 conf]$ cat regionservers
172.25.36.7
172.25.36.8
172.25.36.10
配置hbase-site.xml
[hadoop@server9 conf]$ cat hbase-site.xml
<configuration><!-- 指定 region server 的共享目录,用来持久化 HBase。这里指定的 HDFS 地址是要跟 core-site.xml 里面的 fs.defaultFS 的 HDFS 的 IP 地址或者域名、端口必须一致。 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://masters/hbase</value>
</property>
<!-- 启用 hbase 分布式模式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- Zookeeper 集群的地址列表,用逗号分割。默认是 localhost,是给伪分布式用的。要修改才能在完全分布式的情况下使用。 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>172.25.36.7,172.25.36.8,172.25.36.10</value>
</property>
<!-- 指定 hbase 的 master -->
<property>
<name>hbase.master</name>
<value>h1</value>
</property>
</configuration>
执行启动脚本,启动hbase
[hadoop@server9 hbase-1.2.4]$ bin/start-hbase.sh
starting master, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-master-server1.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
172.25.36.7: starting regionserver, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-regionserver-server2.out
172.25.36.8: starting regionserver, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-regionserver-server3.out
172.25.36.10: starting regionserver, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-regionserver-server4.out
172.25.36.7: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
172.25.36.7: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
172.25.36.8: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
172.25.36.8: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
172.25.36.10: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
172.25.36.10: Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
查看server9/6 主节点信息 HMaster
[hadoop@server9 hbase-1.2.4]$ jps
17602 DFSZKFailoverController
17779 NameNode
20483 Jps
20330 HMaster
19372 ResourceManager
查看server7/8/10节点信息 HRegionServer
[hadoop@server7 ~]$ jps
4338 QuorumPeerMain
5111 DataNode
6185 Jps
5931 HRegionServer
4940 JournalNode
5551 NodeManager
进入 bin/hbase shell,插入数据
[hadoop@server9 hbase-1.2.4]$ bin/hbase shell
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hadoop/hbase-1.2.4/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop/hadoop-3.2.1/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
HBase Shell; enter 'help<RETURN>' for list of supported commands.
Type "exit<RETURN>" to leave the HBase Shell
Version 1.2.4, r67592f3d062743907f8c5ae00dbbe1ae4f69e5af, Tue Oct 25 18:10:20 CDT 2016hbase(main):001:0> create 'test', 'cf'
0 row(s) in 2.4580 seconds=> Hbase::Table - test
hbase(main):002:0> list 'test'
TABLE
test
1 row(s) in 0.0220 seconds=> ["test"]
hbase(main):003:0> put 'test', 'row1', 'cf:a', 'value1'
0 row(s) in 0.1580 secondshbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2'
0 row(s) in 0.0160 secondshbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3'
0 row(s) in 0.0200 secondshbase(main):006:0> scan 'test'
ROW COLUMN+CELL row1 column=cf:a, timestamp=1629022054722, value=value1 row2 column=cf:b, timestamp=1629022060634, value=value2 row3 column=cf:c, timestamp=1629022066509, value=value3
3 row(s) in 0.0630 seconds
执行ls命令,插入数据可以在hadoop内查看到
[hadoop@server6 ~]$ cd hadoop
[hadoop@server6 hadoop]$ bin/hdfs dfs -ls /
Found 2 items
drwxr-xr-x - hadoop supergroup 0 2021-08-15 06:04 /hbase
drwxr-xr-x - hadoop supergroup 0 2021-08-15 04:16 /user
访问 172.25.36.9:16010,可以看到 master 为 server9, backup 为server6, regions server为 server7/8/10
2.故障切换
关闭hmaster进程
[hadoop@server9 hbase-1.2.4]$ jps
17602 DFSZKFailoverController
20882 Jps
17779 NameNode
20330 HMaster
19372 ResourceManager
[hadoop@server9 hbase-1.2.4]$ kill 20330
查看切换,master切换为server6
启动server9节点
[hadoop@server9 hbase-1.2.4]$ bin/hbase-daemon.sh start master
starting master, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-master-server1.out
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
jps查看 HMaster
[hadoop@server9 hbase-1.2.4]$ jps
17602 DFSZKFailoverController
21170 Jps
17779 NameNode
19372 ResourceManager
21055 HMaster
此时backup master 显示为 server9