1、背景:
spark采用了stand alone模式,其中master基于zookeeper部署了高可用;
zookeeper维护了当前的active master信息,以及所属worker信息
worker和active master进行通信
而spark的启动脚本SPARK_HOME/sbin/start-all.sh脚本里,默认会将启动的worker与本机启动的master进行通信.
2、正确操作:
高可用的spark集群重新启动时:
先杀死standby master,然后在master节点依次执行stop-all.sh start-all.sh 最后登陆standby master节点,启动;
3、异常分析:
如果没有杀死standby master,直接在active master节点执行了stop-all.sh start-all.sh会发生什么问题呢?
实验一:
高可用spark集群启动:此时,worker与g3-test-26的master进行通信。(worker默认与本机启动的master进行通信)
g3-test-26: start-all.sh (active master)
g3-test-27: start-master.sh (standby. master)
异常关闭集群:
在g3-test-26上执行命令:
g3-test-26:/opt/cslc/spark-2.4.5-bin-hadoop2.7/sbin/stop-all.sh
g3-test-26:/opt/cslc/spark-2.4.5-bin-hadoop2.7/sbin/start-all.sh
此时,g3-test-27变成active master(zookeeper记录这个active master的所有worker均为head状态)
新启动的g3-test-26为standby master,而启动的worker在和standby master 进行通信,无法在zk进行注册,结果g3-test-27:8080上显示无worker,g3-test-26上显示无worker,并且任务无法正常运行。
解决办法1:先杀死当前standby master,然后在active master节点执行重启操作,最后再启动standby master
解决办法2:停止所有进程,清理zookeeper里面spark的元数据,然后先start-all.sh启动,然后切换到另一个节点启动standby master
4、worker单独启动:
先查找active master节点:
可以在对应master的web ui 查看 例如: http://104.21.51.77:8080 可以在zookeeper的客户端查看: get /spark/master_status
然后登陆worker节点,执行
${SPARK_HOME}/sbin/start-slave.sh spark://104.21.51.76:7077
或者登陆active master节点,执行
${SPARK_HOME}/sbin/start-slaves.sh