企业中一般都使用zookeeper的高可用搭建Spark。其原理就是通过zookeeper来选举一个Master,其它的Master都处于Standby状态。
-
首先将conf/spark-env.sh中master的地址注释掉
-
然后引用zookeeper相关的配置,添加一个属性SPARK_DAEMON_JAVA_OPTS
export 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"
在zookeeper中的spark目录中保存元数据信息。

这里将之前手动指定的master注释掉,master由zookeeper指定选出。
然后引入zookeeper:
这里的3个参数,分别指定:恢复模式为zookeeper;zookeeper的server地址和端口号(这里的2181);元信息的保存目录,在zookeeper下的spark目录下。
参数说明
spark.deploy.recoveryMode:恢复模式(Master重新启动的模式)
有三种:(1)ZooKeeper (2) FileSystem (3)NONE
FileSystem在测试阶段用,生产中用Zookeeper,因为基于文件系统的需要我们手动启动挂掉的Master,NONE表示不恢复;
spark.deploy.zookeeper.url:ZooKeeper的Server地址,以及端口号;
spark.deploy.zookeeper.dir:指定对应保存在zookeeper上的节点目录。即集群元数据信息的文件、目录,包括Worker,Driver和Application的信息。
通过上边这3个参数,构建高可用的Spark。
配置结束以后,发放到node-2和node-3:

致此,高可用的Spark集群搭建好了。
企业当中一般启动两个Master。
配置zookeeper
为了方便快速启动zookeeper,首先添加zookeeper的环境变量:
在/etc/profile
中添加

保存之后,将
profile
文件发送的node-2和node-3上:
刷新一下各机器的
/etc/profile

测试一下环境变量配置成功:

前边配置了zookeeper的环境变量,下边编写批量启动和停止zookeeper的脚本文件
在export目录下创建script目录,用于存放脚本文件

创建一个脚本
start_zk.sh
批量启动所有机器上的zookeeper:
#!/bin/sh
for host in node-1 node-2 node-3
do
ssh $host "source /etc/profile;zkServer.sh start"
echo "$host zk is running"
done

同时为了方便,再创建一个
stop_zk.sh
批量关闭zookeeper:
#!/bin/sh
for host in node-1 node-2 node-3
do
ssh $host "source /etc/profile;zkServer.sh stop"
echo "$host zk is stopping"
done
查看所有节点上的zookeeper状态信息status_zk.sh
:
#!/bin/sh
for host in node-1 node-2 node-3
do
ssh $host "source /etc/profile;zkServer.sh status"
echo "$host zk's status"
done
编写完成之后测试一下脚本:



使用jps可以查看zookeeper进程是否启动,使用zkServer.sh status
查看启动状态。


可以看到现在只有zookeeper节点,目前还没有spark节点。
接下来启动Spark集群:
启动Spark HA 之前先要启动zookeeper集群。
先在哪台机器上运行启动命令,就会先在哪台机器上构建Master。



现在就有了spark节点。里边存放了选举的信息,当前哪个master是活着的master。

在node-2上运行
start-master.sh
命令,使用jps命令查看,发现也启动了Master进程。
这里可以看到node-2是一个standby的状态。内核和cpu的资源都是0。
先启动的node-1,所以node-1是alive,然后再启动的node-2,node-2就是standby的状态。
这个时候做一个测试,到node-1上杀死Master进程:
使用kill -9 进程号
命令杀死进程


恢复不是一瞬间的,先感知到Master挂掉,再对其它所有处于standby状态的master进行选举,再来选举出一个活着的master,然后就开始恢复到之前的master的状态。需要一到两分钟。

CPU核数和内存是所有节点之和。
再次启动node-1上的master,node-1变为了standby的状态,而node-2为alive状态。

网友评论