本文面向对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

这样一串字符串信息。


(全文完)