基于ZooKeeper实现HA高可用性以及自动主备切换
默認(rèn)情況下,standalone cluster manager對(duì)于worker節(jié)點(diǎn)的失敗是具有容錯(cuò)性的(迄今為止,Spark自身而言對(duì)于丟失部分計(jì)算工作是有容錯(cuò)性的,它會(huì)將丟失的計(jì)算工作遷移到其他worker節(jié)點(diǎn)上執(zhí)行)。然而,調(diào)度器是依托于master進(jìn)程來(lái)做出調(diào)度決策的,這就會(huì)造成單點(diǎn)故障:如果master掛掉了,就沒法提交新的應(yīng)用程序了。為了解決這個(gè)問(wèn)題,spark提供了兩種高可用性方案,分別是基于zookeeper的HA方案以及基于文件系統(tǒng)的HA方案。
基于zookeeper的HA方案
概述
使用zookeeper來(lái)提供leader選舉以及一些狀態(tài)存儲(chǔ),你可以在集群中啟動(dòng)多個(gè)master進(jìn)程,讓它們連接到zookeeper實(shí)例。其中一個(gè)master進(jìn)程會(huì)被選舉為leader,其他的master會(huì)被指定為standby模式。如果當(dāng)前的leader master進(jìn)程掛掉了,其他的standby master會(huì)被選舉,從而恢復(fù)舊master的狀態(tài)。并且恢復(fù)作業(yè)調(diào)度。整個(gè)恢復(fù)過(guò)程(從leader master掛掉開始計(jì)算)大概會(huì)花費(fèi)1~2分鐘。要注意的是,這只會(huì)推遲調(diào)度新的應(yīng)用程序,master掛掉之前就運(yùn)行的應(yīng)用程序是不被影響的。
配置
如果要啟用這個(gè)恢復(fù)模式,需要在spark-env.sh文件中,設(shè)置SPARK_DAEMON_JAVA_OPTS選項(xiàng):
spark.deploy.recoveryMode 設(shè)置為ZOOKEEPER來(lái)啟用standby master恢復(fù)模式(默認(rèn)為NONE)spark.deploy.zookeeper.url zookeeper集群url(舉例來(lái)說(shuō),192.168.0.103:2181,192.168.0.104:2181)spark.deploy.zookeeper.dir zookeeper中用來(lái)存儲(chǔ)恢復(fù)狀態(tài)的目錄(默認(rèn)是/spark)
備注:如果在集群中啟動(dòng)了多個(gè)master節(jié)點(diǎn),但是沒有正確配置master去使用zookeeper,master在掛掉進(jìn)行恢復(fù)時(shí)是會(huì)失敗的,
因?yàn)闆]法發(fā)現(xiàn)其他master,并且都會(huì)認(rèn)為自己是leader。這會(huì)導(dǎo)致集群的狀態(tài)不是健康的,因?yàn)樗衜aster都會(huì)自顧自地去調(diào)度。
細(xì)節(jié)
在啟動(dòng)一個(gè)zookeeper集群之后,啟用高可用性是很直接的。簡(jiǎn)單地在多個(gè)節(jié)點(diǎn)上啟動(dòng)多個(gè)master進(jìn)程,并且給它們相同的zookeeper
配置(zookeeper url和目錄)。master就可以被動(dòng)態(tài)加入master集群,并可以在任何時(shí)間被移除掉。
為了調(diào)度新的應(yīng)用程序或者向集群中添加worker節(jié)點(diǎn),它們需要知道當(dāng)前l(fā)eader master的ip地址。這可以通過(guò)傳遞一個(gè)master列表來(lái)完成。舉例來(lái)說(shuō),我們可以將我們的SparkContext連接的地址指向spark://host1:port1,host2:port2。這就會(huì)導(dǎo)致你的
SparkContext嘗試去注冊(cè)所有的master,如果host1掛掉了,那么配置還是正確的,因?yàn)闀?huì)找到新的leader master,也就是host2。
對(duì)于注冊(cè)一個(gè)master和普通的操作,這是一個(gè)重要的區(qū)別。當(dāng)一個(gè)應(yīng)用程序啟動(dòng)的時(shí)候,或者worker需要被找到并且注冊(cè)到當(dāng)前的leader master的時(shí)候。一旦它成功注冊(cè)了,就被保存在zookeeper中了。如果故障發(fā)生了,new leader master會(huì)去聯(lián)系所有的之前注冊(cè)過(guò)的應(yīng)用程序和worker,并且通知它們master的改變。這樣的話,它們甚至在啟動(dòng)的時(shí)候都不需要知道new master的存在。
正是由于這個(gè)屬性,new master可以在任何時(shí)間被創(chuàng)建,并且我們唯一需要擔(dān)心的一件事情就是新的應(yīng)用程序和worker可以找到并且注冊(cè)到master。一旦注冊(cè)上去之后,我們就不用擔(dān)心它了。
實(shí)驗(yàn)
1、將192.168.2.15機(jī)器上的spark集群先停止
./sbin/stop-all.sh
2、修改機(jī)器上的spark-env.sh文件,在其中加入上述三個(gè)屬性
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、啟動(dòng)集群
在192.168.2.15上直接用啟動(dòng)集群:./sbin/start-all.sh
4、在192.168.2.16上部署spark安裝包,并啟動(dòng)一個(gè)master進(jìn)程
安裝scala 2.11.4
1、將課程提供的scala-2.11.4.tgz使用WinSCP拷貝到/usr/local/src目錄下。
2、對(duì)scala-2.11.4.tgz進(jìn)行解壓縮:tar -zxvf scala-2.11.4.tgz
3、對(duì)scala目錄進(jìn)行重命名:mv scala-2.11.4 scala
4、配置scala相關(guān)的環(huán)境變量
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環(huán)境變量
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上單獨(dú)啟動(dòng)一個(gè)standby master進(jìn)程:./sbin/start-master.sh
4、提交應(yīng)用程序
將master地址修改為192.168.2.15:7077,192.168.2.16:7078
5、殺掉原先的leader master,等到standby master接管集群
再次提交應(yīng)用程序
6、再次手動(dòng)啟動(dòng)原來(lái)的leader master(死掉)
問(wèn)題
1、集群中包含兩個(gè)節(jié)點(diǎn),在192.168.2.15上配置了master和worker,
在192.168.2.16上配置了worker
但是在15集群上 ./sbin/start-all.sh
在16 集群上不啟動(dòng) worker!! 原因在 在conf中的slaves.template 沒有重命名,重命名為slaves 即可
slaves中:
A Spark Worker will be started on each of the machines listed below.
Spark1
Spark2
2、在15 上直接啟動(dòng) ./sbin/start-all.sh
在16 上 ./sbin/start-master.sh
3、此時(shí)在文本上查看 192.168.2.15:8088
192.168.2.16:8088
查看,一個(gè)為standby 一個(gè)為alive !
將aliver 的jps kill-9 殺死掉
大概一分鐘,之后 standby將變?yōu)閍liver狀態(tài),此時(shí)基于zookeeper的主備機(jī)切換完成!
~
總結(jié)
以上是生活随笔為你收集整理的基于ZooKeeper实现HA高可用性以及自动主备切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 山竹的食用方法有哪些 山竹可以怎么吃
- 下一篇: HBase出现java.lang.NoC