Spark HA搭建
Spark Standalone和大部分Master/slave模式一样,都存储Master单点故障问题,解决方式可以基于Zookeeper实现两个Master无缝切换,类似HDFS的NameNode HA(High Availability,高可用)或者YARN的ResourceManager HA。
Spark可以在集群中启动多个Master,并使它们都向Zookeeper进行注册,Zookeeper利用自己的选举机制保证同一时间只有一个Master是活动状态(active)的,其他的都是备用状态(standby)。
当活动状态的Master出现故障时,Zookeeper会从其他备用状态的Master选出一台成为活动的Master,整个恢复过程大约在1分钟。对应恢复期间正在运行的程序,由于应用程序在运行前已经向Master申请了资源,运行是Driver负责与Excecutor进行通讯,管理整个应用程序,因此Master的故障对应用程序的运行不会产生影响,但是会影响新应用程序的提交。
以Spark Standalone模式的client运行方式为例,其HA的架构
接下来我们安装已经搭建好的Spark Standalone集群进行Spark HA的搭建,搭建的角色分配如下 Spark HA集群角色分配
节点 | 角色 |
centoshadoop1 | Master
|
centoshadoop2 | Master Worker |
centoshadoop3 | Worker |
centoshadoop4 | Worker |
修改配置文件spark-env.sh
在centoshadoop1节点中修改Spark-env.sh配置文件,删除其中的SPARK_MASTER_IP属性配置,添加以下配置:
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node-1:2181,node-2:2181,node-3:2181 -Dspark.deploy.zookeeper.dir=/spark"
上述配置参数解析如下:
spark.deploy.zookeeper.url: 指定Zookeeper集群各节点的主机名与端口
spark.deploy.zookeeper.dir: 指定Spark在Zookeeper中注册的znode节点名称
然后同步修改后的配置文件到集群其他节点,命令如下:
cd /home/hadoop/spark/spark-2.4.5-bin-hadoop2.7/conf
scp -r spark-env.sh
hadoop@centoshadoop2:/home/hadoop/spark/spark-2.4.5-bin-hadoop2.7/conf/
scp -r spark-env.sh
hadoop@centoshadoop2:/home/hadoop/spark/spark-2.4.5-bin-hadoop2.7/conf/
scp -r spark-env.sh
hadoop@centoshadoop2:/home/hadoop/spark/spark-2.4.5-bin-hadoop2.7/conf/
启动Zookeeper集群及Spark集群
在centoshadoop1节点进入Spark安装目录,启动Spark集群,命令如下:
sbin/start-all.sh
需要注意的是,在那个节点上启动spark集群,活动状态的master就存在于那个节点上。
在centoshadoop2节点上进入Spark安装目录,启动第二个Master(备用状态Master),命令如下:
sbin/start-master.sh
jps查看各个节点的进程是否存在
测试Spark HA
进入Spark Web界面查看两个Master的状态,此时centoshadoop1的节点状态为ALIVE(即是活动状态active)
Centoshadoop2节点Master的状态为STANDBY(备用状态)
在节点一centoshadoop1上停止master进程,稍等几秒后多次刷新centoshadoop2节点的Web界面,发现Master的状态有STANDBY首先变为RECOVERING(恢复,该状态持续时间非常短暂),最后变为ALIVE,如下图:
RECOVERING状态的Master
ALIVE状态的Master
到此,Spark HA搭建完成
此时,若需要连接Spark集群执行操作,--master参数的连接地址需改为spark://centoshadoop2:7077
例如以下代码: 在节点一或者节点二上执行
firewall-cmd --zone=public --add-port=7077/tcp --permanent
firewall-cmd --reload
bin/spark-shell \
--master spark://centoshadoop2:7077