閱讀786 返回首頁    go 技術社區[雲棲]


Run Spark on Mesos with Zookeeper

本文麵向對Spark,Mesos和Zookeeper有一點了解的讀者,介紹下Run Spark on Mesos with Zookeeper的方法和一些注意點。因為Spark和Mesos的相關文檔裏,關於結合Zookeeper之後應該怎麼改寫相應URL和參數這塊講得不太清楚。

版本信息

Zookeeper 3.4.5 stable

Spark 0.8

Mesos 0.13


沒有Zookeeper的時候

Mesos master通過下麵的方式啟動自己並掛起來(Mesos-0.13裏,起master的時候最好加上一個whitelist文件,指明slaves,否則會一直跳一個提示信息,要求說明whitelist)

nohup $MASOS_HOME/sbin/mesos-master --whitelist=file://{MESOS_HOME}/var/mesos/deploy/slaves &
Mesos Slave通過下麵的方式連接Master,5050為默認端口

nohup $MESOS_HOME/sbin/mesos-slave --master=masterIP:5050 &
以上的Mesos啟動方式是單Master的Mesos Cluster,會存在單點故障問題。

而Spark連接Mesos URL run 任務的時候傳的參數是masterIP:5050,比如跑SparkPi:

./run-example org.apache.spark.examples.SparkPi masterIP:5050

Why Zookeeper

Zookeeper功能強大,部署簡單,複雜係統使用zookeeper API來做自己想做的事情。mesos正是引入zookeeper來解決自己的單點故障問題。

Zookeeper將保證Mesos存在多個masters,且在masters中選取一個作為active的master,當其掛掉時,能選取另一個備用master讓mesos的slaves連接到新的master,讓mesos cluster繼續提供服務。


Zookeeper部署

修改conf/zoo.cfg內容,添加zookeeper集群的各個serverip(zoo1,zoo2,zoo3),及zk集群之間的數據同步端口(2888)和master選舉端口(3888),

server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

在zoo1,zoo2,zoo3三台機器的dataDir裏創建一個myid文件,裏麵的內容對應1(2, 3),來指明自己這台機器在上述配置中的server.X的X值

echo "1" > myid
然後分別在三台機器上啟動zk,

$ZK_HOME/bin/zkServer.sh start
啟動之後可以通過

$ZK_HOME/bin/zkServer.sh status
查看自己是master還是follower。


Zookeeper測試

$ZK_HOME/bin/zkCli.sh -server ip:port
Client端連接zk集群的port默認是2181(zoo.cfg裏本來就有寫),連接之後進入一個類文件係統的操作界麵,可以輸入一些命令進行測試:

ls /
可以看到有一個zookeeper路徑,裏麵存放著一些配額信息,無法直接get查看到
create /node1 data1
創建新的znode和數據
get /node1
查看到/node1路徑下的數據
delete /node1
刪除節點及數據,如果節點下麵還是節點的話則該節點無法刪除

Zookeeper需要一定的JVM heap size,查看方法為

jmap -heap pid

加上Zookeeper之後

Mesos master的啟動需要改為

nohup $MESOS_HOME/sbin/mesos-master --whitelist=file://{MESOS_HOME}var/mesos/deploy/slaves --zk=zk://zoo1:2181,zoo2:2181,zoo3:2181/mesos &
其中zoo1,zoo2,zoo3為zk機器的ip,後麵的/mesos是mesos master在zk樹裏的znode,之後slave和spark這樣的外部應用連接使用mesos的時候,必須也使用同一個zk下的路徑,否則,會先創建一個你指定的路徑,然後zk的Master Detector會負責檢測該路徑下有沒有已經注冊了的master。

此外,這時候可以起多個mesos master,會有一個master被select as master,其他master會waiting to be select to be master。且在kill掉當前活躍的master之後,mesos slave會detect到別的masterI(對其來說是一個新的master),然後把自己注冊過去。

Mesos Slave的啟動為

nohup $MESOS_HOME/sbin/mesos-slave --master=zk://zoo1:2181,zoo2:2181,zoo3:2181/mesos &
Run Spark on Mesos With ZK

$SPARK_HOME/run-example org.apache.spark.examples.SparkPi zk://zoo1:2181,zoo2:2181,zoo3:2181/mesos
也就是說,對於Slave和Spark來說,mesos master的ip:port都將由一個zk的URL+路徑代替。具體,連接上zk,去查看/mesos下的內容的話會看到類似,

[zk: localhost:2181(CONNECTED) 0] ls /mesos
[0000000002, 0000000003]
這樣的內容,每個子znode對應一個起來的mesos master,其中的2和3是因為之前我已經起過兩個master,當時是0和1。如果再查看裏麵的內容,會看到

[zk: localhost:2181(CONNECTED) 2] get /mesos/0000000002
master@xx.xx.xx.xx:5050
這樣一串字符串信息。


(全文完)

最後更新:2017-04-03 14:54:08

  上一篇:go 各種排序的時間複雜度
  下一篇:go raw文件係統