本文面向对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
这样一串字符串信息。
(全文完)