Spark Standalone HA基本原理
- Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,会存在Master单点故障(SPOF)的问题。
- 高可用HA(两种方案)
- 基于文件系统的单点恢复(开发或测试环境)。
- 基于zookeeper的Standby Masters(生产环境)。
Zookeeper Standby Masters
- ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master,但是只有一个是Active的,其他的都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。由于集群的信息,包括Worker, Driver和Application的信息都已经持久化到文件系统,因此在切换的过程中只会影响新Job的提交,对于正在进行的Job没有任何的影响。
- 架构图如下所示:
- 总的来说StandAlone HA的原理就是基于Zookeeper做状态的维护, 开启多个Master进程, 一个作为活跃,其它的作为备份,当活跃进程宕机,备份Master进行接管。
Spark Standalone HA部署
- 基于之前部署的Spark Standalone群集,我们需要对一些配置文件进行修改。
- 先在spark-env.sh中, 注释掉SPARK_MASTER_HOST=node1。
- 添加以下内容:
# spark.deploy.recoveryMode 指定HA模式 基于Zookeeper实现
# 指定Zookeeper的连接地址
# 指定在Zookeeper中注册临时节点的路径
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/spark-ha"
- spark-env.sh 分发到每一台服务器上
cd $SPARK_HOME/conf
scp spark-env.sh node2:`pwd`/
scp spark-env.sh node3:`pwd`/
- 停掉之前的群集
sbin/stop-all.sh
- 启动群集
# 在node1上 启动一个master 和全部worker
sbin/start-all.sh
# node2上启动一个备用的master进程
sbin/start-master.sh
node1网址:http://node1:8081/ 因为zk占用8080,所以顺延到8081端口
node2网址:http://node2:8082/ 因为zk占用8080,而worker占用8081,所以就顺延到8082了,具体可以在日志中查看
显示状态为:STANDBY
模拟故障切换
- 提交一个spark任务到当前ALIVE的master上
bin/spark-submit --master spark://node1:7077 /export/server/spark-3.2.0/examples/src/main/python/pi.py 1000
- 模拟故障切换
# node1 master的进程
kill -9 26822
- 观察node2节点的变化显示RECOVERING → ALIVE
- 重新启动node1的master之后发现node1的状态为STANDBY。
总结:HA模式下, 主备切换 不会影响到正在运行的程序,最大的影响是 会让它中断大约30秒左右。