在zookeeper上搭建Spark集羣的小筆記

寫在前面

Spark Standalone集羣是Master-Slaves架構的集羣模式,存在着Master單點故障的問題。爲了解決這個問題,Spark有提供一種方案:

基於zookeeper的Standby Master:將spark集羣連接到同一個Zookeeper實例,並啓動多個Master,利用zookeeper提供的選舉和狀態保存的功能,可以使一個Master被選舉成活着的Master,其他Master處於Standby狀態。如果現任的Master掛掉了,另外一個就可通過選舉產生,並恢復到舊的Master狀態,然後恢復調度。

下面來介紹怎麼在zookeeper上搭建高可用的Spark集羣。

安裝Zookeeper

下載Zookeeper(先在Master上搞)

下載Zookeeper可以到這裏下載:ZooKeeper Releases

我選擇的版本是3.4.14,不推薦用太新的版本,用新的版本意味着可能要踩別人沒踩過的坑,踩別人踩過的坑有利於我們更快地總結問題解決問題。

# 下載下來後解壓
tar -zxvf zookeeper-3.4.14.tar.gz -C /usr/local
配置Zookeeper
#把zookeeper目錄的操作權限賦給我的hadoop用戶
sudo chown -R hadoop /usr/local/zookeeper-3.4.14
#進入Zookeeper的安裝目錄
cd /usr/local/zookeeper-3.4.14
#拷貝重命名
cp zoo_sample.cfg zoo.cfg
#配置zoo.cfg
vi zoo.cfg

修改如下內容

#存放數據的目錄

dataDir=/usr/local/zookeeper-3.4.14/zData

#存放日誌的目錄

dataLogDir=/usr/local/zookeeper-3.4.14/logs

#zookeeper集羣裏的主機和端口號

server.1= Master:2888:3888

server.2= Slave1:2888:3888

創建相應的數據和日誌目錄

修改上面的配置文件後,不要忘記創建相應的數據目錄和日誌目錄

cd /usr/local/zookeeper-3.4.14
mkdir zData
mkdir logs
分發Zookeeper目錄

在做好上述配置後,分發配置好的Zookeeper目錄到各個機子上去

cd /usr/local
#在Master上分發Zookeeper目錄到Slave1的同樣路徑下
scp -r zookeeper-3.4.14/ Slave1:`pwd`

注意:可以在Slave1執行命令sudo chown -R hadoop /usr/local/zookeeper-3.4.14,把目錄的操作權限賦給hadoop用戶,因爲我是在hadoop用戶下搭的集羣,假如你的是root用戶下搭建的,就省去賦予權限的操作。

創建myid

分發完畢後,到各個機子上創建相對的myid

注意,創建myid不是亂創建,還記得之前配置過的這些字段🐎,要對應起來

server.1= Master:2888:3888

server.2= Slave1:2888:3888

  • 爲此我在Master的/usr/local/zookeeper-3.4.14/zData下創建myid爲1

    cd /usr/local/zookeeper-3.4.14/zData
    echo 1 > myid
    
  • 在Slave1的/usr/local/zookeeper-3.4.14/zData下創建myid爲2

    cd /usr/local/zookeeper-3.4.14/zData
    echo 2 > myid
    
啓動zookeeper
#在集羣的各個主機上啓動zookeeper,緊接着查看各自的zookeeper狀態,是leading還是following
cd /usr/local/zookeeper-3.4.14/bin
./zkServer.sh start
./zkServer.sh status

安裝Spark

安裝Spark這一步的詳細過程可以查看我的另一篇博文:小坨的Spark分佈式集羣環境搭建小筆記

按照上面這一篇博文把Spark安裝好之後,它的Spark集羣架構還是Spark Standalone的Master-Slaves架構的集羣模式,存在着Master單點故障的問題。

修改Spark的配置文件

我們只要稍微修改一下里面的配置文件,就能實現Spark集羣的高可用。

cd /usr/local/spark/
vi spark-env.sh

註釋掉如下內容

#SPARK_MASTER_HOST=192.168.100.10

註釋掉master節點的ip,因爲高可用部署的master是變化的

添加如下內容

export SPARK_DAEMON_JAVA_OPTS="

-Dspark.deploy.recoveryMode=ZOOKEEPER

-Dspark.deploy.zookeeper.url=Master,Slave1

-Dspark.deploy.zookeeper.dir=/spark"

其中

  • recoveryMode,恢復模式(Master重新啓動的模式)有三種:Zookeeper、FileSystem、None
  • deploy.zookeeper.url,Zookeeper的服務器地址
  • deploy.zookeeper.dir,zookeeper上保存集羣元數據信息的文件、目錄。

啓動基於zookeeper的Spark集羣

完成上面的操作,我們的基於zookeeper的高可用的Spark集羣就搭建起來了,下面我們啓動集羣看看能不能正常運行。

  • 先啓動zookeeper,上面已經啓動一遍了,這裏不重複啓動

  • 再啓動spark

    #在Master上
    cd /usr/local/spark/sbin
    ./start-all.sh
    #在Slave1上
    cd /usr/local/spark/sbin
    ./start-master.sh
    

    在Master上執行jps命令,可以看到Master已經啓動,至於這裏還出現了個Worker,是因爲我在Master上也部署了一個Worker。
    在這裏插入圖片描述
    在Slave1上執行jps命令,可以看到Worker已經啓動,至於也出現了個Master,證明我們的基於zookeeper的高可用的Spark集羣已經搭建完成了。

驗證集羣是否高可用

上面我們高可用的Spark集羣已經搭建完成了,這裏再驗證一下集羣是否高可用。

在上面啓動基於zookeeper的Spark集羣,我們看到Spark集羣裏出現了兩個Master,其中一個是alive的Master,一個是 standby的Master,它會在ALIVE的Master宕機或關閉之後,接替ALIVE的Master,控制集羣的運行。

這時我在我的http://master:8080/查看到Master節點上的Master是alive的,在 http://slave1:8080/ 查看到Slave1節點上的Master是alive的。

在這裏插入圖片描述
在這裏插入圖片描述

接下來我在Master節點上關閉master,看是否Slave1節點上的Master能接替上來。

cd /usr/local/spark/sbin
./stop-master.sh

這時再重新連接 http://master:8080/頁面已經連接不上了,因爲我把Master節點上Master進程關閉了。

重新連接 http://slave1:8080/ 發現Slave1上的Master已經從standby狀態轉爲alive。

在這裏插入圖片描述

到這裏,我們的基於zookeeper的高可用的Spark集羣已經搭建成功,集羣的高可用性能驗證通過。我們可以跑Spark了,跑Spark之前,我們要對Spark裏的RDD有一個基本的認識,可以見我的另一篇博文:Spark之初識RDD

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章