1,集羣介紹
在之前Spark集羣搭建博客中介紹了Spark的四種運行模式以及搭建。
- local
- standalone
- yarn
- mesos
目前接觸的只有前三種,由於yarn集羣本身就是高可用的,所以下面就只對standalone集羣進行高可用搭建。
2,普通Spark集羣介紹
如圖所示,這種設計模式並不好,若是Master進程所在的幾點負載過高,就會出現單點故障,整個集羣也就OOM了,爲了解決這個問題,我們又設計了另一種高可用的模式。
3,高可用Spark集羣介紹
如圖所示,這種設計模式就是高可用的Spark集羣搭建,與高可用的完全分佈式集羣相似,都是基於Zookeeper的,由zookeeper集羣監控兩個master的狀態,當一個master掛掉後,立即進行準備切換,保持集羣的正常運行。
問題探討:
1,master主備切換過程中,能不能提交一個新的Application應用程序呢?
答案:不能,因爲準備切換過程中有以下幾個狀態
STANDBY ==> RECOVERING ==>COMPLETED_RECOVERY ==>ALIVE
當你提交Application時,還處於切換過程中,此時舊的master已經掛掉,新的master還沒切換成Alive狀態
2,如果已經有一個Application已經在集羣中運行了,那麼此時進行主備切換,對這個Application有沒有影響。
答案:沒有影響,因爲Spark是粗粒度資源調度,在任務運行之前就已經向master爲Application申請好了資源,當Application運行時已經不需要master了,所以沒有影響。
3,Spark準備切換過程,切換的幾種狀態
STANDBY ==> RECOVERING ==>COMPLETED_RECOVERY ==>ALIVE
4,Spark準備切換過程中,需要做哪些工作?
- Zookeeper拉起備用master,將其狀態置爲Alive 備用master從
- zookeeper集羣拉取元數據
- 備用master向worker節點發送信息,通知worker節點已經更masetr,以後想自己發送心跳信息
4,高可用Spark集羣的搭建流程
此篇集羣搭建是在原有Spark集羣的基礎上進行的,所以請參考Spark集羣搭建這篇博客進行普通Spark集羣的搭建。
若是已經參考上篇博客搭建完畢,接下來開始進行高可用的搭建
1,進入spark安裝目錄
[root@node01 /]# cd /opt/software/spark-1.6.3/conf/
[root@node01 conf]# ll
total 44
-rwxrwxrwx. 1 root root 1081 Nov 7 19:59 core-site.xml
-rwxrwxrwx. 1 root root 987 Nov 7 19:59 docker.properties.template
-rwxrwxrwx. 1 root root 1105 Nov 7 19:59 fairscheduler.xml.template
-rwxrwxrwx. 1 root root 2089 Nov 7 19:59 hdfs-site.xml
-rwxrwxrwx. 1 root root 1734 Nov 7 19:59 log4j.properties.template
-rwxrwxrwx. 1 root root 6671 Nov 7 19:59 metrics.properties.template
-rwxrwxrwx. 1 root root 898 Nov 7 19:59 slaves
-rwxrwxrwx. 1 root root 1292 Nov 7 19:59 spark-defaults.conf.template
-rwxrwxrwx. 1 root root 4624 Nov 10 12:24 spark-env.sh
2,修改spark-env.sh文件,修改配置如下
[root@node01 conf]# vim spark-env.sh
SPARK_MASTER_IP=node01
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=3
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_DIR=/opt/software/spark/worker
SPARK_WORKER_INSTANCES=1
HADOOP_CONF_DIR=/opt/software/hadoop-2.6.5/etc/hadoop
#用於配置高可用
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node02:2181,node03:2181,node04:2181 -Dspark.deploy.zookeeper.dir=/spark-1106"
3,將配置好的spark-env.sh推送到其他節點上
scp -r spark-env.sh node02:`pwd`
scp -r spark-env.sh node03:`pwd`
scp -r spark-env.sh node04:`pwd`
................................
4,選擇一臺節點作爲備用master,修改那臺節點的spark-env.sh配置信息,將SPARK_MASTER_IP設爲node02
SPARK_MASTER_IP=node02
SPARK_MASTER_PORT=7077
SPARK_WORKER_CORES=3
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_DIR=/opt/software/spark/worker
SPARK_WORKER_INSTANCES=1
HADOOP_CONF_DIR=/opt/software/hadoop-2.6.5/etc/hadoop
#用於配置高可用
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node02:2181,node03:2181,node04:2181 -Dspark.deploy.zookeeper.dir=/spark-1106"
5,啓動zookeeper集羣,在node02,node03,node04節點分別啓動zookeeper。
zkServer.sh start
6,啓動Spark集羣
start-spark.sh
7,手動啓動備用master
//命令在spark的sbin目錄下
start-master.sh
8,在WebUI界面查看
如圖所示,啓動了兩個Master,一個處於Alive狀態,一個處於Standby狀態,說明集羣正常啓動。
9,高可用測試(看看是否是假的高可用)
如圖所示,node01是Alive狀態的master,通過jps看下master進程的Id,使用kill -9 Id 殺死master(alive)
[root@node01 conf]# jps
24449 Master
89680 Jps
86853 NameNode
87157 DFSZKFailoverController
87276 ResourceManager
[root@node01 conf]# kill -9 24449
10,查看node02狀態是否自動切換