786
技術社區[雲棲]
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:portClient端連接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