在Mesos上运行Spark

来源:互联网 发布:国家统计局怎么查数据 编辑:程序博客网 时间:2024/04/29 05:10

实验环境:Red Hat 6、spark-1.3.1-bin-hadoop2.4、mesos-0.21.0、hadoop-2.5.2、jdk1.7、scala-2.10.4


      本文主要记录Spark运行在Mesos上的环境搭建。


各节点软件:

IP主机名安装软件或运行的进程192.168.70.130worker00Mesos Master、Mesos Slave、Hadoop DataNode、Spark spark-shell、jdk、scala192.168.70.131worker01Mesos Master、Mesos Slave、Hadoop NameNode、jdk、scala192.168.70.132worker02Mesos Master、Mesos Slave、Hadoop NameNode、jdk、scala192.168.70.135worker05ZooKeeper、Hadoop DataNode、jdk192.168.70.136worker06ZooKeeper、Hadoop DataNode、jdk192.168.70.137worker07ZooKeeper、Hadoop DataNode、jdk


部署步骤:

步骤1、安装jdk和scala。

      略。


步骤2、部署ZooKeeper集群。

      可以参考  Zookeeper 简要介绍和安装 和 ZooKeeper集群搭建 这两篇文章。 


步骤3、部署Mesos集群。

      这里采用High Availability。Mesos集群部署可以参考我之前的文章: Mesos单点Master集群部署和High Availability集群部署


步骤4、下载Spark二进制包。

      想要在mesos集群上运行Spark,那么Spark二进制包自然是必不可少的。可以去Apache Spark 官网下载一个预先编译好的包,点击这里进入下载页面:Download Spark


步骤5、上传Spark包

      当Mesos集群在Mesos Slave上第一次运行一个任务时,那个slave必须有一个Spark二进制包来在后端运行Spark Mesos executor。可以把这个二进制包上传到任何Hadoop可访问的URI上,包括通过http://访问HTTP,通过s3n://来访问Amazon简单存储服务,或者通过hdfs://来访问HDFS。我这里采用的HDFS,所以需要部署Hadoop集群,并且Hadoop集群采用High Availability,部署Hadoop集群可以参考Hadoop 2.4.1集群搭建。当然您也可以其他方法。

上传包之前需要对这个二进制包解压后,在 spark-env.sh中添加一个环境变量JAVA_HOME,然后再打成tgz包上传到HDFS上。

1)将下载好的包解压:tar -zxvf  spark-1.3.1-bin-hadoop2.4.tgz

 

2) 修改conf下的spark-env.sh,添加JAVA_HOME环境变量。spark-env.sh这个文件由spark-env.sh.template复制而来。

3) 压缩:tar -zcvf  spark-1.3.1-bin-hadoop2.4.tgz spark-1.3.1-bin-hadoop2.4

4) 将压缩好的spark包上传到hdfs。我在hdfs根目录下新建了一个spark文件夹,spark-1.3.1-bin-hadoop2.4.tgz放在该文件夹下。


注意:Apache Spark 官网上的部署文档中是没有这个步骤的,它直接将下载好的二进制包进行了上传,这样会使RDD执行到action这步骤时,出问题。查看Mesos Slave日志可以发现如下的提示:

 


步骤6:配置文件添加环境变量

1、修改Spark相关的配置文件

只需要在Mesos Master上的一个节点中对Spark解压,进行配置即可。

1) 在spark-env.sh文件中添加如下三个环境变量。

export MESOS_NATIVE_JAVA_LIBRARY=<path to libmesos.so>. 这个目录是由Mesos决定的:一般是 <prefix>/lib/libmesos.so , prefix 默认是/usr/local;

export SPARK_EXECUTOR_URI=<上面的spark-1.3.1-bin-hadoop2.4上传到的URL> ;

export Master=<mesos集群Master所在节点>,Mesos  Master URL 是这样的形式 :单点Master Mesos集群:mesos://host:5050  或者 使用ZooKeeper的多个Master的Mesos集群: mesos://zk://ZooKeeperHost1:2181,ZooKeeperHost1:2181,ZooKeeperHost1:2181/path

注意,下图中export SPARK_EXECUTOR_URI=hdfs://ns1/spark/spark-1.3.1-bin-hadoop2.4.tgz 中的“ns1”是Hadoop集群的hdfs的逻辑命名空间,因为我用ZooKeeper实现了对NameNode的高可靠性。如果单个NameNode的Hadoop集群可以直接使用“主机名(或者IP):端口” 来替代。


2) 在 spark-defaults.conf中添加如下环境变量:

其中spark.master和spark.executor.uri这两个环境变量的意思与spark-env.sh中的MASTER和 SPARK_EXECUTOR_URI一样。至于spark.mesos.coarse这个值默认是false的,我这里设为true,因为在我机子上,设为true时,对Spark的任务进行action操作时会反复报“Initial job has not accepted any resource”的错误。官方文档对spark.mesos.coarse这个参数的解释是这样的:If set to "true", runs over Mesos clusters in "coarse-grained" sharing mode, where Spark acquires one long-lived Mesos task on each machine instead of one Mesos task per Spark task. This gives lower-latency scheduling for short queries, but leaves resources in use for the whole duration of the Spark job.意思大概是:如果设置为“true”,在Mesos集群上以粗粒度模式运行,Spark在每台机子上获取一个长久存活的Mesos任务,而不是每个Spark任务一个Mesos任务。



2、修改Mesos配置文件(步骤5中采用HDFS上传包时需要该步骤)

对Mesos集群的mesos-slave-env.sh配置文件加入一个MESOS_hadoop_home环境变量。


如果该变量不加,Mesos就不会知道Hadoop安装在哪里。在对Spark的任务进行action操作时会反复报“Initial job has not accepted any resource”的错误。查看Mesos Slave的日志可以发现,它不认识hadoop这个命令,从而无法从HDFS上下载我们之前上传的spark-1.3.1-bin-hadoop2.4.tgz 这个包。如下图:



步骤7:启动

1) 启动ZooKeeper集群: ./zkServer.sh start

2) 启动Mesos集群:./mesos-start-cluster.sh

3) 启动HDFS:./start-dfs.sh

4) 最后启动spark-shell: ./spark-shell


步骤8:提交任务并查看

输入 

val data = 1 to 1000; 

val distData = sc.parallelize(data); 

distData.filter(_< 10).collect() 

进行测试:



参考网页:

Running Spark on Mesos   

Run Apache Spark on Apache Mesos

spark with Hadoop 2.3.0 on Mesos 0.21.0 with error “sh: 1: hadoop: not found” on slave

Spark fun - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient memory

0 0
原创粉丝点击