- 一、hadoop高可用集群部署
- 1.hadoop高可用集群简介
- 2.部署说明
- 3.Zookeeper 集群搭建
- 4.hadoop-HA高可用搭建
- 4.故障自动切换
- 二、YARN(资源管理器 RM)高可用集群部署
- 1.部署
- 2.故障切换
- 三、Hbase高可用集群部署
- 1.部署
- 2.故障切换
- 在典型的 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;事实上,运行这些守护进程是错误的。
实验准备五台虚拟机,准备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 |
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集群)的状态如下
server9编辑/home/hadoop/etc/hadoop/core-site.xml文件
1 fs.defaultFS %指定 hdfs 的 namenode 为 masters (名称可自定义,前后要一致)hdfs://masters ha.zookeeper.quorum %指定 zookeeper 集群主机地址172.25.36.7:2181,172.25.36.8:2181,172.25.36.10:2181
编辑etc/hadoop/hdfs-site.xml 文件
[hadoop@server9 hadoop]$ cat hdfs-site.xml%副本数为3 dfs.replication 3 %指定 hdfs 的 nameservices 为 masters,和 core-site.xml 文件中的设置保持一致 dfs.nameservices masters %masters 下面有两个 namenode 节点,分别是 h1 和 h2 (名称可自定义) dfs.ha.namenodes.masters h1,h2 %指定 h1 节点的 rpc 通信地址 dfs.namenode.rpc-address.masters.h1 172.25.36.9:9000 %指定 h1 节点的 http 通信地址 dfs.namenode.http-address.masters.h1 172.25.36.9:9870 %指定 h2 节点的 rpc 通信地址 dfs.namenode.rpc-address.masters.h2 172.25.36.6:9000 %指定 h2 节点的 http 通信地址 dfs.namenode.http-address.masters.h2 172.25.36.6:9870 %指定 NameNode 元数据在 JournalNode 上的存放位置 dfs.namenode.shared.edits.dir qjournal://172.25.36.7:8485;172.25.36.8:8485;172.25.36.10:8485/masters %指定 JournalNode 在本地磁盘存放数据的位置 dfs.journalnode.edits.dir /tmp/journaldata %开启 NameNode 失败自动切换 dfs.ha.automatic-failover.enabled true %配置失败自动切换实现方式 dfs.client.failover.proxy.provider.masters org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider %配置隔离机制方法,每个机制占用一行 dfs.ha.fencing.methods sshfence shell(/bin/true) %使用 sshfence 隔离机制时需要 ssh 免密码 dfs.ha.fencing.ssh.private-key-files /home/hadoop/.ssh/id_rsa %配置 sshfence 隔离机制超时时间 dfs.ha.fencing.ssh.connect-timeout 30000
在三个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,可以看到上传的文件
现在关闭 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-site.xml 文件
[hadoop@server9 hadoop]$ cat yarn-site.xml%配置可以在 nodemanager 上运行 mapreduce 程序 yarn.nodemanager.aux-services mapreduce_shuffle %指定变量 yarn.nodemanager.env-whitelist 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 %激活 RM 高可用 yarn.resourcemanager.ha.enabled true %指定 RM 的集群 id yarn.resourcemanager.cluster-id RM_CLUSTER %定义 RM 的节点 yarn.resourcemanager.ha.rm-ids rm1,rm2 %指定 RM1 的地址 yarn.resourcemanager.hostname.rm1 172.25.36.9 %指定 RM2 的地址 yarn.resourcemanager.hostname.rm2 172.25.36.6 %激活 RM 自动恢复 yarn.resourcemanager.recovery.enabled true %配置 RM 状态信息存储方式,有 MemStore 和 ZKStore yarn.resourcemanager.store.class org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore %配置为 zookeeper 存储时,指定 zookeeper 集群的地址 yarn.resourcemanager.zk-address 172.25.36.7:2181,172.25.36.8:2181,172.25.36.10:2181
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
杀掉server9的RM
server7查看,rm2(server5)自动接管active
访问172.25.36.6:8088,可以看到是active
当然访问172.25.36.9:8088失败,恢复也很简单,server9开启RM
但是server9现在是standby,因为没有必要浪费资源切换
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.xmlhbase.rootdir hdfs://masters/hbase hbase.cluster.distributed true hbase.zookeeper.quorum 172.25.36.7,172.25.36.8,172.25.36.10 hbase.master h1
执行启动脚本,启动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' for list of supported commands. Type "exit " to leave the Hbase Shell Version 1.2.4, r67592f3d062743907f8c5ae00dbbe1ae4f69e5af, Tue Oct 25 18:10:20 CDT 2016 hbase(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 seconds hbase(main):004:0> put 'test', 'row2', 'cf:b', 'value2' 0 row(s) in 0.0160 seconds hbase(main):005:0> put 'test', 'row3', 'cf:c', 'value3' 0 row(s) in 0.0200 seconds hbase(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
关闭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



