您的位置:首页 > 其它

spark-mesos运行自己编译的程序

2014-05-16 14:07 211 查看
配置好了spark-mesos环境,在上面可以运行示例,但是缺少了编译的过程。要了解里面的运行过程,需要编译代码在上面成功运行,才能进一步了解。记录一下如何编译运行实例。
首先,安装SBT(simple build tool)。
参考(http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html)
我的环境是在CentOS上

a. 下载jar包(http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html),将该jar包放在/root/bin/目录下。

b. 创建文件 /root/bin/sbt 在文件中输入下面两行

SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"

java $SBT_OPTS -jar `dirname $0`/sbt-launch.jar "$@"

c. 给/root/bin/sbt增加可执行的权限  chmod u+x /root/bin/sbt

d. 执行/root/bin/sbt 就会自动下载所需要的包并安装

e. 安装过后,修改环境变量,方便直接使用。自此完成了SBT的安装

然后准备测试源代码

参考(http://spark.apache.org/docs/latest/quick-start.html)中的A Standalone App in Scala,因为我们运行在Mesos集群中,所以和官方文档我们有些差异。

a. 创建一个文件SimpleApp.scala,输入源代码:

import org.apache.spark.SparkContext

import org.apache.spark.SparkContext._

import org.apache.spark.{SparkConf, SparkContext}

object SimpleApp {

  def main(args: Array[String]) {

    val conf = new SparkConf()

             .setMaster("mesos://192.168.1.55:5050")//Mesos的master节点的地址

             .setAppName("My application")

             .set("spark.executor.memory", "3g")

    val logFile = "/home/yushiyao/spark/test/generate_points.sh" // 这个文件在本地和Mesos的slave节点上都要有该文件

    val sc = new SparkContext(conf)

    val logData = sc.textFile(logFile, 2).cache()

    val numAs = logData.filter(line => line.contains("a"))

    val numAs_count = numAs.count()

    val numBs = logData.filter(line => line.contains("b"))

    val numBs_count = numBs.count()

    println("Lines with a: %s, Lines with b: %s".format(numAs_count, numBs_count))

  }

}

b. 创建一个文件simple.sbt输入内容

name := "Simple Project"

version := "1.0"

scalaVersion := "2.10.3"

libraryDependencies += "org.apache.spark" %% "spark-core" % "0.9.1"

resolvers += "Akka Repository" at "http://repo.akka.io/releases/"

c. 按照下列树状结构,组织目录和文件

$ find .

.

./simple.sbt

./src

./src/main

./src/main/scala

./src/main/scala/SimpleApp.scala

d. 执行sbt package 对源码进行编译

e. 编译之后将整个目录拷贝到Mesos的两个slave节点中,之后要将编译生成simple-project_2.10-1.0.jar该文件的目录加到两个slave的环境变量CLASSPATH中,本人的路径是

/home/yushiyao/spark/spark-0.9.1/sbt/test/target/scala-2.10/simple-project_2.10-1.0.jar。

经过研究,在master下发任务时,在slave节点中会执行从master下发下来路径中的./spark/sbin/spark-excutor这个脚本(下发的文件见spark+meso安装运行博文)。而这个脚本最后会先执行./spark/bin/compute-classpath.sh这个脚本,这个脚本会执行./spark/conf/spark-env.sh这个脚本导入环境变量(如果有这个文件的话)。所以楼主就在spark-env.sh文件中加入了一行,

export CLASSPATH=/home/yushiyao/spark/spark-0.9.1/sbt/test/target/scala-2.10/simple-project_2.10-1.0.jar

但是执行仍然没有成功,原因是在上面所说的compute-classpath.sh这个脚本中,脚本在生成CLASSPATH变量的时候覆盖了原来的值,楼主修改了其中的一行,

将这一行CLASSPATH="$SPARK_CLASSPATH:$FWDIR/conf"

改为CLASSPATH="$SPARK_CLASSPATH:$FWDIR/conf:$CLASSPATH"

这样我们的slave就可以找到需要执行的类了。

f. 执行 sbt run 执行中遇到了两个问题,第一个是Spark home is not set,第二个是no mesos in java.library.path。这两个错误都是环境变量的原因,需要在执行sbt run之前导入环境变量

export MESOS_NATIVE_LIBRARY=/usr/local/lib/libmesos.so 安装mesos之后的库文件所在位置

export SPARK_HOME=/home/yushiyao/spark/spark-0.9.1/  spark的安装目录

此外需要说明的是,在运行出错时,slave节点会给出出错信息方便我们查找错误。在master节点上查看framwork号,然后在slave中查找和framwork号的路径,具体的出错信息就在这个路径下可以找到。附上我的某一次执行结果和出错路径

/tmp/mesos/slaves/20140514-030920-922855616-5050-4627-17/frameworks/20140515-030109-922855616-5050-13534-0017/executors/20140514-030920-922855616-5050-4627-17/runs/latest
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: