1、停止 Spark 集群
[hadoop@hadoop02 ~]$ cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
[hadoop@hadoop02 ~]$ sbin/stop-all.sh
2、配置 ZooKeeper 集群
安装、配置并且启动好 ZooKeeper 集群
3、修改 SPARK_HOME/conf 目录中的 spark-env.sh 配置文件
删掉:export SPARK_MASTER_HOST=hadoop02
增加一行:export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -
Dspark.deploy.zookeeper.url=hadoop01,hadoop02,hadoop03 -Dspark.deploy.zookeeper.dir=/spark"
-Dspark.deploy.recoveryMode=ZOOKEEPER
说明整个集群状态是通过zookeeper来维护的,整个集群状态的恢复也是通过zookeeper来维护的。就是说用 zookeeper 做了 Spark 的 HA 配置,Master(Active)挂掉的话,Master(standby)要想变成 Master(Active)的话,Master(Standby)就要像 zookeeper 读取整个集群状态信息,然后进行恢复所有 Worker 和 Driver 的状态信息,和所有的Application 状态信息
-Dspark.deploy.zookeeper.url=hadoop2:hadoop03:hadoop04
将所有配置了 zookeeper,并且在这台机器上有可能做 master(Active)的机器都配置进来(我用了 3 台,就配置了 3 台)
-Dspark.deploy.zookeeper.dir=/spark
这里的 dir 和 zookeeper 配置文件 zoo.cfg 中的 dataDir 的区别???
-Dspark.deploy.zookeeper.dir 是保存 spark 的元数据,保存了 spark 的作业运行状态;zookeeper 会保存 spark 集群的所有的状态信息,包括所有的 Workers 信息,所有的Applactions 信息,所有的 Driver 信息。
4、兼容hadoop集群
如果是高可用 Hadoop 集群,一定要把 core-site.xml 和 hdfs-site.xml 放置$SPARK_HOME/conf 目录中,然后所有节点要同步。
5、同步配置文件
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop03:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop04:$PWD
[hadoop@hadoop02 conf]$ scp -r spark-env.sh hadoop05:$PWD
6、启动集群
在 hadoop02 上执行:
[hadoop@hadoop02 ~]$ cd /home/hadoop/apps/spark-2.3.0-bin-hadoop2.7
[hadoop@hadoop02 spark-2.3.0-bin-hadoop2.7]$ sbin/start-all-spark.sh
此时,通过观察启动日志,或者检查 hadoop03 上是否包含有 master 进程等都可以得知hadoop04 上的 master 并不会自动启动,所以需要手动启动。那么在 hadoop03 执行命令进行启动:sbin/start-master.sh
7、验证高可用
这是正常情况:浏览器访问hadoop02:7077 和 hadoop03:7077
Hadoop02 是 spark 集群的 active master 节点
Hadoop04 是 spark 集群的 standby master 节点
通过杀掉 active master 观察是否 hadoop03 能启动切换为 active 状态。