Spark StandAlone HA集群搭建

StandAlone HA 运行原理

Spark Standalone集群是Master-Slaves架构的集群模式,存在着Master单点故障的问题。

高可用 HA

解决单点故障有两种方案:

  1. 基于文件系统的单点恢复(Single-Node Recovery with Local File System):只能用于开发或测试环境

  2. 基于zookeeper的Standby Masters(Standby Masters with ZooKeeper): 可用于生产环境

ZooKeeper 提供了一个Leader Election 机制, 利用这个机制可以保证虽然集群存在多个Master,但是只有一个Active的,其他都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。由于集群的信息,包括Worker, Driver和Applicaiton 的信息都已经持久化到文件系统,因此在切换的过程中只会影响新的job的提交,对于正在进行的job没有任何的影响。加入ZooKeeper的集群整体架构如下图所示:

高可用HA StandAlone集群搭建

前提: 确保Zookeeper和HDFS均已经启动

修改配置文件即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cd /opt/spark/conf
vi spark-env.sh

echo '
## java安装目录
JAVA_HOME=/opt/java/jdk1.8.0_271
## HADOOP软件配置文件目录,读取HDFS上文件和运行YARN集群
HADOOP_CONF_DIR=/opt/hadoop/hadoop-3.2.3/etc/hadoop
YARN_CONF_DIR=/opt/hadoop/hadoop-3.2.3/etc/hadoop

# ## 指定spark master运行在哪台机器
# export SPARK_MASTER_HOST=master

## 指定spark master的通讯端口
export SPARK_MASTER_PORT=9777
## 告知spark master的webui 端口
SPARK_MASTER_WEBUI_PORT=9780
## work cpu可用核数
SPARK_WORKER_CORES=1
## work 可用内存
SPARK_WORKER_MEMORY=1g
## work 的工作通讯地址
SPARK_WORKER_PORT=9778
## work 的webui地址
SPARK_WORKER_WEBUI_PORT=9781
## 设置历史服务器
# 配置的意思是 将spark程序运行的历史日志 存到hdfs的/sparklog文件夹中
SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://master:9710/sparklog -Dspark.history.fs.cleaner.enabled=true"

SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=master:2181,worker1:2181,worker2:2181 -Dspark.deploy.zookeeper.dir=/spark-ha"
' >> spark-env.sh

# 发送到各个节点
scp spark-env.sh 192.168.1.7:/opt/spark/conf/
scp spark-env.sh 192.168.1.9:/opt/spark/conf/

# 重启
./sbin/stop-all.sh
./sbin/start-all.sh

# 这个时候 master节点必然是 master

# 进入worker1节点,启动master,然后jps查看进程
./sbin/start-master.sh

# 有时候存在端口被占用或顺延,如下方式查端口
JPS # 查看进程ID 34784
netstart -anp|grep 34784

master注释掉;spark.deploy.recoveryMode 指定HA模式,基于zookeeper实现;指定zookeeper的连接地址;指定zookeeper中注册临时节点的路径。

测试运行

1
2
3
4
## 只需要把master的停掉
kill -9 JPS查询master_进程ID

# 可以在worker1节点先启动任务(以pi圆周率任务为例),执行过程中停掉master进程