基于ZooKeeper实现HA高可用性以及自动主备切换
默認情況下,standalone cluster manager對于worker節點的失敗是具有容錯性的(迄今為止,Spark自身而言對于丟失部分計算工作是有容錯性的,它會將丟失的計算工作遷移到其他worker節點上執行)。然而,調度器是依托于master進程來做出調度決策的,這就會造成單點故障:如果master掛掉了,就沒法提交新的應用程序了。為了解決這個問題,spark提供了兩種高可用性方案,分別是基于zookeeper的HA方案以及基于文件系統的HA方案。
基于zookeeper的HA方案
概述
使用zookeeper來提供leader選舉以及一些狀態存儲,你可以在集群中啟動多個master進程,讓它們連接到zookeeper實例。其中一個master進程會被選舉為leader,其他的master會被指定為standby模式。如果當前的leader master進程掛掉了,其他的standby master會被選舉,從而恢復舊master的狀態。并且恢復作業調度。整個恢復過程(從leader master掛掉開始計算)大概會花費1~2分鐘。要注意的是,這只會推遲調度新的應用程序,master掛掉之前就運行的應用程序是不被影響的。
配置
如果要啟用這個恢復模式,需要在spark-env.sh文件中,設置SPARK_DAEMON_JAVA_OPTS選項:
spark.deploy.recoveryMode 設置為ZOOKEEPER來啟用standby master恢復模式(默認為NONE)spark.deploy.zookeeper.url zookeeper集群url(舉例來說,192.168.0.103:2181,192.168.0.104:2181)spark.deploy.zookeeper.dir zookeeper中用來存儲恢復狀態的目錄(默認是/spark)
備注:如果在集群中啟動了多個master節點,但是沒有正確配置master去使用zookeeper,master在掛掉進行恢復時是會失敗的,
因為沒法發現其他master,并且都會認為自己是leader。這會導致集群的狀態不是健康的,因為所有master都會自顧自地去調度。
細節
在啟動一個zookeeper集群之后,啟用高可用性是很直接的。簡單地在多個節點上啟動多個master進程,并且給它們相同的zookeeper
配置(zookeeper url和目錄)。master就可以被動態加入master集群,并可以在任何時間被移除掉。
為了調度新的應用程序或者向集群中添加worker節點,它們需要知道當前leader master的ip地址。這可以通過傳遞一個master列表來完成。舉例來說,我們可以將我們的SparkContext連接的地址指向spark://host1:port1,host2:port2。這就會導致你的
SparkContext嘗試去注冊所有的master,如果host1掛掉了,那么配置還是正確的,因為會找到新的leader master,也就是host2。
對于注冊一個master和普通的操作,這是一個重要的區別。當一個應用程序啟動的時候,或者worker需要被找到并且注冊到當前的leader master的時候。一旦它成功注冊了,就被保存在zookeeper中了。如果故障發生了,new leader master會去聯系所有的之前注冊過的應用程序和worker,并且通知它們master的改變。這樣的話,它們甚至在啟動的時候都不需要知道new master的存在。
正是由于這個屬性,new master可以在任何時間被創建,并且我們唯一需要擔心的一件事情就是新的應用程序和worker可以找到并且注冊到master。一旦注冊上去之后,我們就不用擔心它了。
實驗
1、將192.168.2.15機器上的spark集群先停止
./sbin/stop-all.sh
2、修改機器上的spark-env.sh文件,在其中加入上述三個屬性
export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.2.15:2181,192.168.2.16:2181 -Dspark.deploy.zookeeper.dir=/spark”
3、啟動集群
在192.168.2.15上直接用啟動集群:./sbin/start-all.sh
4、在192.168.2.16上部署spark安裝包,并啟動一個master進程
安裝scala 2.11.4
1、將課程提供的scala-2.11.4.tgz使用WinSCP拷貝到/usr/local/src目錄下。
2、對scala-2.11.4.tgz進行解壓縮:tar -zxvf scala-2.11.4.tgz
3、對scala目錄進行重命名:mv scala-2.11.4 scala
4、配置scala相關的環境變量
vi ~/.bashrc
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin
source ~/.bashrc
5、查看scala是否安裝成功:scala -version
安裝spark客戶端
1、將spark-1.5.1-bin-hadoop2.4.tgz使用WinSCP上傳到/usr/local/src目錄下。
2、解壓縮spark包:tar -zxvf spark-1.5.1-bin-hadoop2.4.tgz。
3、重命名spark目錄:mv spark-1.5.1-bin-hadoop2.4 spark
4、修改spark環境變量
vi ~/.bashrc
export SPARK_HOME=/usr/local/spark
export PATH=SPARKHOME/binexportCLASSPATH=.:SPARKHOME/binexportCLASSPATH=.:CLASSPATH:JAVAHOME/lib:JAVAHOME/lib:JAVA_HOME/jre/lib
source ~/.bashrc
修改spark-env.sh文件
1、cd /usr/local/spark/conf
2、cp spark-env.sh.template spark-env.sh
3、vi spark-env.sh
export JAVA_HOME=/usr/java/latest
export SCALA_HOME=/usr/local/scala
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
export SPARK_MASTER_IP=192.168.2.16
export SPARK_DAEMON_MEMORY=100m
export SPARK_DAEMON_JAVA_OPTS=”-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=192.168.2.15:2181,192.168.2.16:2181 -Dspark.deploy.zookeeper.dir=/spark”
在192.168.2.16上單獨啟動一個standby master進程:./sbin/start-master.sh
4、提交應用程序
將master地址修改為192.168.2.15:7077,192.168.2.16:7078
5、殺掉原先的leader master,等到standby master接管集群
再次提交應用程序
6、再次手動啟動原來的leader master(死掉)
問題
1、集群中包含兩個節點,在192.168.2.15上配置了master和worker,
在192.168.2.16上配置了worker
但是在15集群上 ./sbin/start-all.sh
在16 集群上不啟動 worker!! 原因在 在conf中的slaves.template 沒有重命名,重命名為slaves 即可
slaves中:
A Spark Worker will be started on each of the machines listed below.
Spark1
Spark2
2、在15 上直接啟動 ./sbin/start-all.sh
在16 上 ./sbin/start-master.sh
3、此時在文本上查看 192.168.2.15:8088
192.168.2.16:8088
查看,一個為standby 一個為alive !
將aliver 的jps kill-9 殺死掉
大概一分鐘,之后 standby將變為aliver狀態,此時基于zookeeper的主備機切換完成!
~
總結
以上是生活随笔為你收集整理的基于ZooKeeper实现HA高可用性以及自动主备切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山竹的食用方法有哪些 山竹可以怎么吃
- 下一篇: 五十岁叫什么之年(人到五十,则要有三不争