1 两种解决方案
1基于文件系统的单点恢复,主要用于开发或者测试环境,spark提供目录保存spark application和worker的注册信息,并将它们的恢复状态写入该目录中。一旦master发生故障,就可以通过重新启动master进程(sbin/start-master.sh),恢复已运行的spark application和worker的注册信息。
2基于zookeeper的standby masters:通过zk来选举一个master,其他master处于standby状态。整个选举恢复需要2-3分钟。
3.3.1 前提条件
依赖zk,需要提前搭建zk集群
3.3.2 搭建步骤
在node1上修改 spark-env.sh文件
Vim spark-env.sh
#手动注释掉配置的master地址
#export SPARK_MASTER_HOST=node1
#引入zk 构建高可用spark集群
Export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=nodel:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/spark”
#将配置分发到其他节点上
Scp spark-env.sh node2:/exprot/servers/spark/conf
Scp spark-env.sh node3:/export/servers/spark/conf
#启动高可用脚本
- 启动zk集群,编写启动脚本start-all-nodes.sh
#!/bin/sh
For host in nod1 node2 node3
Do
Ssh $host “source /etc/profile:nohup zkServer.sh start > /dev/null 2>&1&”
Echo “$host zk is running”
Done
#启动自定的脚本(前提是要实现任意2台机器之间的ssh免密码登录)
Start-all-nodes.sh
说明:你在那台机器执行这个文件,它就会在当前机器启动一个master进程。
整个spark集群中的woker进程的启动有slavers文件决定
#单独启动master进程
Start-master.sh
#高可用的总结:
这个时候引入zk,构建一个高可用的spark集群,在这里就有很多个master,其中有一个master被选举成活着的master,其他的多个master都处理standby,活着的master会提供服务,处理standby中的master不会提供服务,同时也把整个spark集群的元数据信息通过zk集群中的“/spark”节点去保存。
如果此时活着的master挂掉了,首先zk会感知到,然后在所有处理standby中的master进行选举,最后产生一个新的活着的master,这个新的活着的master会读取到zk集群中保存spark集群元数据信息的节点,最后恢复到上一次挂掉的状态。整个恢复阶段需要一定时间,大约1-2分钟。
Start-dfs.sh 启动hdfs。
3.4 集群master挂掉的影响
1.对正在运行的任务有没有影响?
没有,既然任务正在运行,就说明它是已经获取得到了资源,既然有了资源,就不需要master了,继续运行就可以了。
2.对于在恢复阶段提交的任务有没有影响?
有,对于这个任务来说,由于整个spark集群没有这样一个活着的master存在,任务也就分配不到计算资源,这个任务那不到资源,任务就无法执行。