目录
一、Hadoop的高可用原理概述
1.1 原理概述
1.2 实验环境要求
二、高可用集群的搭建
2.1 搭建Zookeeper
2.2 搭建HA的高可用
2.3 YARN(资源管理器 RM)高可用集群部署
2.4 HBase高可用
一、Hadoop的高可用原理概述
1.1 原理概述
????????高可用是指在集群中当有一太master,出现故障时,另外一台可以接替其工作。
????????在典型的 HA 集群中,通常有两台不同的机器充当 NN。两台主机只有一台处于Active状态,另一台处于Standby。处于Active状态的主机负责HA集群中的操作管理,Standby负责备份,当Active出现状况时,可自动切换启动使用。
??????? 在HA集群中为了让 Standby 和 Active 两台主机保持元数据保持一致,它们都将会和JournalNodes 守护进程通信。当 Active节点执行任何有关命名空间的修改,它需要持久化到一半以上的 JournalNodes 上(通过 edits log 持久化存储),而 Standby节点负责观察 edits log的变化,从 JNs 中读取 edits 信息,并更新其内部的命名空间。当 Active节点出现故障,Standby将会保证从 JNs 中读出了全部的 Edits,然后切换成 Active 状态。
??????? Standby? 读取全部的 edits 可确保发生故障转移之前,是和 Active拥有完全同步的命名空间状态。
????????为了提供快速的故障恢复,Standby也需要保存集群中各个文件块的存储位置。为了实现这个,集群中所有的 Database 将配置好 Active和 Standby的位置,并向它们发送块文件所在的位置及心跳,如下图所示:
【注】在 HA 集群中,Standby也执行 namespace 状态的 checkpoints,所以不必要运行Secondary NN、CheckpointNode 和 BackupNode。
1.2 实验环境要求
????????5台虚拟机、Zookeeper的压缩包
其中: server1、5搭建NN的高可用;
server2、3、4搭建zk\jk\dn
虚拟机ip | 主机名 | 搭载的服务 | 192.168.19.71 | server1 | NameNode、ResourceManager、DFSZKFailoverController | 192.168.19.75 | server5 | NameNode、ResourceManager、DFSZKFailoverController | 192.168.19.72 | server2 | DataNode、NodeManager、JournalNode、QuorumPeerMain | 192.168.19.73 | server3 | DataNode、NodeManager、JournalNode、QuorumPeerMain | 192.168.19.74 | server4 | DataNode、NodeManager、JournalNode、QuorumPeerMain |
【注】 (1)NameNode machines:运行 Active和 Standby 的机器需要相同的硬件配置;
(2)JN :相对来说比较轻量,可以和其他线程(比如 NN,YARN ResourceManager)运行在同一台机器上。
(3)在一个集群中,最少要运行 3 个 JN 守护进程,来增强容错能力。更多则需要保证运行个数为奇数个 JN(3、5、7 等),当运行 N 个 JN,系统将最多容忍(N-1)/2 个 JN 崩溃。
二、高可用集群的搭建
2.1 搭建Zookeeper
##清空所有运行进程
sbin/stop-all/.sh
##清楚数据缓存目录--->server1\2\3均要清除
rm -fr /tmp/*
##新加入节点安装nfs--->server4\5
yum install -y nfs-utils
##新加入节点创建目录并挂载共享文件--->server4\5
useradd hadoop
echo 123 | passwd --stdin hadoop
mount 192.168.19.71:/home/hadoop /home/hadoop
##对zookeeper压缩包进行解压--->nfs共享,所有主机均生效
tar zxf zookeeper-3.4.9.tar.gz
##对ZK进行配置--->server2\3\4
mkdir /tmp/zookeeper -->存储ZK集群信息
cd zookeeper-3.4.9/
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg -->加入zk三个节点的IP,IP1:192.168.19.72\IP2:192.168.19.73\IP3:192.168.19.74 -- 端口2888(同步数据)3888(选举leader)
---------------------
server.1=192.168.19.72:2888:3888
server.2=192.168.19.73:2888:3888
server.3=192.168.19.74:2888:3888
---------------------
##将对应的编号写入对应主机的文件中--->server2\3\4
echo 1 > /tmp/zookeeper/myid --server2
echo 2 > /tmp/zookeeper/myid --server3
echo 3 > /tmp/zookeeper/myid --server4
##在server2\3\4上开启zkserver
cd zookeeper-3.4.9
bin/zkServer.sh start
##查看各节点状态--->server2\3\4
bin/zkServer.sh status
##在leader节点执行初始化命令--server2(status--leader)
bin/zkCli.sh
##分别查看节点运行的进程--->server2\3\4
jps
2.2 搭建HA的高可用
##编辑server1的core-site.xml文件:/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>192.168.19.72:2181,192.168.19.72:2181,192.168.19.72:2181</value>
</property>
</configuration>
---------------------------------------------------------
##编辑hdfs-site.xml文件:/home/hadoop/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"?>
<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>192.168.19.71:9000</value>
</property>
<property> --指定 h1 节点的 http 通信地址
<name>dfs.namenode.http-address.masters.h1</name>
<value>192.168.19.71:9870</value>
</property>
<property> --指定 h2 节点的 rpc 通信地址
<name>dfs.namenode.rpc-address.masters.h2</name>
<value>192.168.19.75:9000</value>
</property>
<property> --指定 h2 节点的 http 通信地址
<name>dfs.namenode.http-address.masters.h2</name>
<value>192.168.19.75:9870</value>
</property>
<property> --指定 NameNode 元数据在 JournalNode 上的存放位置
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://192.168.19.72:8485;192.168.19.73:8485;192.168.19.74: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>
sshfence
shell(/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>
---------------------------------------------------------
##开启journalnode服务-->第一次开启需要手动按顺序启动-->server2\3\4
bin/hdfs --daemo start journalnode
##在jps中查看
jps
##进入server5hadoop目录,格式化HDFS集群
bin/hdfs namenode -format
##Namenode数据默认存放在/tmp,将server1数据拷贝到server5
scp -r /tmp/hadoop-hadoop server1:/tmp
设置server5-->server1的免密登录
ssh server1
##格式化zookeeper(只需要在h5上执行即可)
bin/hdfs zxfc -formatZK
##在nn节点进行查看-->server2
zookeeper/bin/zkCli.sh --不要推出
##server5启动dfs
hadoop/sbin/start-dfs.sh
jps --查看启动的zk监控器
##server2上查看数据
ls /hadoop-ha/master
get /hadoop-ha/ActiveBreadCrumb
##WEB访问:
192.168.19.75:9870 ---active
192.168.19.71:9870 ---standby
##数据测试
##在server5上创建Hadoop目录,上传input到DFS
hadoop/bin/hdfs dfs -mkdir /user
hadoop/bin/hdfs dfs -mkdir /user/hadoop
hadoop/bin/hdfs dfs -ls
hadoop/bin/hdfs dfs -put input
##web访问界面,查看数据目录
192.168.19.75:9870
##关闭server5的nn-->模拟节点故障
jps
kill pid
##在dn上查看-->server2
get /hadoop-ha/ActiveBreadCrumb
##访问server1,查看DN --server1--status:active
192.168.19.71:9870
##查看server5的input---没有异常
hadoop/bin/hdfs dfs -ls input
##节点恢复-->server5
hadoop/bin/hdfs --daemon start namenode
##此时server1为active server5为standby--没有必要再次切换浪费资源
##可通过节点访问192.168.19.71:9870
2.3 YARN(资源管理器 RM)高可用集群部署
##配置yarn-site.xml文件
--------------------------------------
[hadoop@server9 hadoop]$ cat yarn-site.xml
<?xml version="1.0"?>
<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>192.168.19.71</value>
</property>
<property> --指定 RM2 的地址
<name>yarn.resourcemanager.hostname.rm2</name>
<value>192.168.19.75</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>192.168.19.72:2181,192.168.19.73:2181,192.168.19.74:2181</value>
</property>
</configuration>
--------------------------------------
##server5上开启服务
/home/hadoop/hadoop/sbin/start-yarn.sh
jps --查看服务开启情况
##分别查看是否开启服务--->server2\3\4
jps --resourcemanger\nodemanger
##在nodemanger节点上查看active状态的节点
get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb
##访问相应的web端进行查看
192.168.19.71:8088
##模拟故障切换
##查看rm1上的PID
jps
kill PID
##查看rm2此时的状态
get /yarn-leader-election/RM_CLUSTER/ActiveBreadCrumb
##访问网页端
192.168.19.71:8088
访问192.168.19.75:8088失败
##重新启动
bin/yarn ---daemo start resourcemanger --状态没有切换,没有必要额外浪费资源
2.4 HBase高可用
##下载HBase,并进行解压
tar zxf hbase-1.2.4-bin.tar.gz
##配置hbase的环境变量,加入java,hadoop的路径
vim ~/hbase-1.2.4/conf/hbase-env.sh
--------------------------------------------
export JAVA_HOME=/home/hadoop/java
export HADOOP_HOME=/home/hadoop/hadoop
...
export HBASE_MANAGES_ZK=false ---由于已经配置好zk集群,因此不采用hbase自带的zk ,设置为false
--------------------------------------------
##配置 regionservers 文件,加入集群节点
192.168.19.72
192.168.19.73
192.168.19.74
##配置habse-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>192.168.19.72, 192.168.19.73, 192.168.19.74</value>
</property>
<!-- 指定 hbase 的 master -->
<property>
<name>hbase.master</name>
<value>h1</value>
</property>
</configuration>
----------------------------------------------
##执行启动脚本
bin/start-hbase.sh
##查看 HMaster信息-->server1\5
jps
##查看HRegionServer-->server2\3\4
jps
##进入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 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
---------------------------------------------------
##在hadoop中查看
hadoop/bin/hdfs dfs -ls /
##在web端访问
192.168.19.75:16010 --- master为server5, backup 为server1,regions server为 server2/3/4
#故障切换
##关闭hmaster
jps
kill PID
##查看切换
192.168.19.71:16010
##启动server5
hadoop/bin/habse-daemon.sh start master
##查看进程
jps
192.168.19.75:16010 ---显示为backup
|