Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题。
运行原理
Spark提供的解决方案
- 基于文件系统的单点恢复(Single-Node Recovery with Local File System)–只能用于开发或测试环境
- 基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)–可以用于生产环境
Zookeeper
# 下载zookeeper安装包
# https://zookeeper.apache.org/releases.html
https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
# 解压到指定文件夹
tar -zxvf apache-zookeeper-3.7.0-bin.tar.gz -C /hadoop/software/
# 修改文件名
mv apache-zookeeper-3.7.0-bin zookeeper
# 创建一个文件夹放置集群节点文件
mkdir /hadoop/file/zookeeper-cluster
# 准备文件夹(各个节点都需要)
cd zookeeper-cluster/ && mkdir data log && echo "211" > data/myid
cd zookeeper-cluster/ && mkdir data log && echo "212" > data/myid
cd zookeeper-cluster/ && mkdir data log && echo "213" > data/myid
# 进入 zookeeper 的 conf 文件夹,复制 zoo_sample.cfg(各个节点都需要)
cd /hadoop/software/zookeeper/conf/ && cp zoo_sample.cfg zook-cluster.cfg && ll && > zook-cluster.cfg
cd /hadoop/software/zookeeper/conf/ && cp zoo_sample.cfg zook-cluster.cfg && ll && > zook-cluster.cfg
cd /hadoop/software/zookeeper/conf/ && cp zoo_sample.cfg zook-cluster.cfg && ll && > zook-cluster.cfg
# 修改 3个配置文件中的一部分
# 原文件
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper-cluster/data
dataLogDir=/usr/local/zookeeper-cluster/log
clientPort=2181
server.211=node-211:2888:3888
server.212=node-212:2889:3889
server.213=node-213:2890:3890
# node-211
# 数据目录配置项,myid 文件位于此目录下
dataDir=/hadoop/file/zookeeper-cluster/data
# 日志目录配置项,不设置的话默认使用 dataDir 配置的路径
dataLogDir=/hadoop/file/zookeeper-cluster/log
# 表示客户端连接 zookeeper 集群中的节点的端口号
clientPort=2181
# node-212
dataDir=/hadoop/file/zookeeper-cluster/data
dataLogDir=/hadoop/file/zookeeper-cluster/log
clientPort=2181
# node-213
dataDir=/hadoop/file/zookeeper-cluster/data
dataLogDir=/hadoop/file/zookeeper-cluster/log
clientPort=2181
# 启动Zookeeper
cat /hadoop/software/zookeeper/conf/zook-cluster.cfg
cd /hadoop/software/zookeeper/ && bin/zkServer.sh start conf/zook-cluster.cfg
# 查看状态
/hadoop/software/zookeeper/bin/zkServer.sh status conf/zook-cluster.cfg
# 停止
/hadoop/software/zookeeper/bin/zkServer.sh stop conf/zook-cluster.cfg
高可用
前提: 确保
Zookeeper
和HDFS
均已经启动
# 编辑spark-env.sh
vi /hadoop/software/spark/conf/spark-env.sh
# 配置文件中固定master是谁, 那么就无法用到zk的动态切换master功能了
# # SPARK_MASTER_HOST=node-211 # 删除或注释掉
# 增加
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-211:2181,node-212:2181,node-213:2181 -Dspark.deploy.zookeeper.dir=/hadoop/file/spark-ha"
# spark.deploy.recoveryMode 指定HA模式 基于Zookeeper实现
# 指定Zookeeper的连接地址
# 指定在Zookeeper中注册临时节点的路径
# 将spark-env.sh 分发到每一台服务器上
scp /hadoop/software/spark/conf/spark-env.sh node-212:/hadoop/software/spark/conf/ && \
scp /hadoop/software/spark/conf/spark-env.sh node-213:/hadoop/software/spark/conf/
# 停止原有的spark集群, 重启
/hadoop/software/spark/sbin/stop-all.sh && /hadoop/software/spark/sbin/start-all.sh
# 在 其他节点上 启动也启动一个master
/hadoop/software/spark/sbin/start-master.sh
# 这时启动了两个master,通过web-ui可以看到一个节点处于ALIVE状态,另一个处于STANDBY
# 执行stop-master.sh,关闭ALIVE的master
# 稍等之后,会发现,处于STANDBY的master状态变成了ALIVE
总结
- StandAlone HA的原理
- 基于Zookeeper做状态的维护,开启多个Master进程
- 一个作为活跃,其它的作为备份
- 当活跃进程宕机,备份Master进行接管
- 不会影响正在运行的Task
- 为什么需要Zookeeper
- 分布式进程是分布在多个服务器上的
- 状态之间的同步需要协调,比如
- 谁是master,谁是worker
- 谁成了master后要通知worker等
- 这些需要中心化协调器Zookeeper来进行状态统一协调
评论区