对于主从分布式集群来说,最可怕的灾难莫过于“单点故障”——主节点宕机了,因为一旦主节点死掉了,就会导致整个集群无法使用。Spark也是主从结构的集群,因此Spark也会存在单点故障的风险。针对单点故障,通常的做法就是搭建一个“高可用集群”,也就是HA集群。对于Spark集群来说,实现HA一般有两种方式:1.基于文件的单节点的HA方式;2.基于Zookeeper的多节点的HA方式。前面我们介绍了第一种HA方式:即基于文件的单节点的HA方式。本节就来介绍第二种HA方式:即基于Zookeeper的多节点的HA方式。
基于Zookeeper的HA方式是一种真正的HA方式。因为这种HA方式,除了拥有一个Active状态的master节点之外,还同时拥有1到多个Standby状态的master节点(由于master节点有多个,因此这种HA方式叫做多节点的HA)。Zookeeper的职责就是当Active状态的master节点宕机时,立即从Standby状态的master节点中选择一个成为Active状态的master节点,并接管原来Active状态的master节点下面的所有worker节点。通过这种master节点主-备切换的方式,来保证Spark集群稳定高效的运行。这种HA方式是实际生产环境中经常使用的HA方案。
下面就来详细介绍一下这种基于Zookeeper的多节点HA的实现过程。
安装介质:
ZooInspector.zip 提取码:y2zg
zookeeper-3.4.10.tar.gz 提取码:9tfw
这里以Spark的全分布模式的HA为例介绍,结构如下:
master:192.168.179.112(主)
slave1:192.168.179.113
slave2:192.168.179.114
zookeeper:192.168.179.112
master:192.168.179.113(备)
1. 搭建Spark集群
搭建Spark集群的过程请参考文章《Spark从入门到精通3:Spark全分布模式的安装和配置》。
2. 搭建Zookeeper集群
Zookeeper有两种常见的搭建方式:1.standalone方式;2.集群方式。这两者的区别是:
- standalone方式只需要一个Zookeeper节点;集群方式至少需要3个节点(一个leader,2个follower);
- standalone方式一旦Zookeeper节点宕机,Spark HA就不能使用了;
- 集群方式如果leader宕机,Zookeeper内部会从follower中选举出一个新的leader,可以对HA提供更有效的保障。
这里以standalone方式演示Spark HA的搭建过程。下面就来介绍Zookeeper的standalone方式的搭建过程:
2.1 上传Zookeeper安装包
[root@master ~]# cd /root/tools/
[root@master tools]# ls
zookeeper-3.4.10.tar.gz
2.2 解压Zookeeper安装包
[root@master tools]# tar -zxvf zookeeper-3.4.10.tar.gz -C /root/training/
2.3 配置Zookeeper环境变量
[root@master tools]# vim /root/.bash_profile
ZOOKEEPER_HOME=/root/training/zookeeper-3.4.10
export ZOOKEEPER_HOME
PATH=$ZOOKEEPER_HOME/bin:$PATH
export PATH
[root@master tools]# source /root/.bash_profile
2.4 配置Zookeeper参数
创建Zookeeper保存数据的目录:
[root@master ~]# mkdir /root/training/zookeeper-3.4.10/tmp
创建Zookeeper Server ID的配置文件myid,内容写入1:
[root@master ~]# vim /root/training/zookeeper-3.4.10/tmp/myid
1
编辑Zookeeper的配置文件zoo.cfg:
[root@master ~]# cd /root/training/zookeeper-3.4.10/conf
[root@master conf]# cp zoo_sample.cfg zoo.cfg
[root@master conf]# vim zoo.cfg
#dataDir=/tmp/zookeeper
dataDir=/root/training/zookeeper-3.4.10/tmp
server.1=master:2888:3888
2.5 启动Zookeeper
[root@master ~]# zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /root/training/zookeeper-3.4.10/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@master ~]# jps
2278 QuorumPeerMain
2295 Jps
启动成功会看到QuorumPeerMain进程。
3.配置Spark HA
3.1 编辑Spark配置文件
需要修改master、slave1、slave2上的spark-env.sh配置文件:
# cd /root/training/spark-2.1.0-bin-hadoop2.7/conf/
# vim spark-env.sh
#export SPARK_MASTER_HOST=master
#export SPARK_MASTER_PORT=7077
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=master:2181
-Dspark.deploy.zookeeper.dir=/spark"
因为Spark的HA中master通过Zookeeper选举产生,所以要注释掉master的相关配置。
3.2 启动Spark全分布模式
[root@master ~]# start-all.sh
[root@master ~]# jps
2278 QuorumPeerMain
2490 Master
2555 Jps
[root@slave1 ~]# jps
2466 Jps
2396 Worker
[root@slave2 ~]# jps
2409 Jps
2334 Worker
3.3 启动一个备用的master
[root@slave1 ~]# start-master.sh
[root@slave1 ~]# jps
2496 Master
2562 Jps
2396 Worker
3.4 查看正常情况下的HA集群状态
(1) master节点上的Spark Master的状态为ALIVE,且下面管理着两个worker。
(2) Slave1节点上的Spark Master的状态为STANDBY,且下面没有任何worker。
(3) 使用ZooInspector工具查看Zookeeper中的数据:master节点为(112),下面有两个worker:(113)和(114)
3.5 查看主master宕机情况下的HA集群状态
(1) 手动杀掉主master
[root@master ~]# jps
2278 QuorumPeerMain
2761 Jps
2490 Master
[root@master ~]# kill -9 2490
(2) 刷新网页:master节点上的Spark Master无法访问。
(3) 刷新网页:Slave1节点上的Spark Master的状态为ALIVE,且原来的两个worker注册到了新的master节点上了。
至此,基于Zookeeper的Spark全分布模式的HA集群已经搭建完毕!祝你玩的愉快!