Jason Koo

      Stay hungry, Stay foolish!

导航

mesos上安装Spark总结

Posted on 2012-12-26 23:23  Jason Koo  阅读(4098)  评论(2编辑  收藏  举报

mesos的具体安装过程可以参考我的上一篇日志《mesos安装总结》。

安装Spark之前要在所有的主机上先安装JDK和Scala。JDK的安装过程就不赘述了。下面简单介绍一下Scala 2.9.2的安装过程。每台主机上都要安装!!!!

首先,从scala官方网站下载scala 2.9.2的压缩包

接着,使用命令tar zxvf scala-2.9.2.tgz解压文件,得到文件夹scala-2.9.2。

然后,在用户主目录下创建一个名为.scala的文件夹,将scala-2.9.2拷贝到.scala目录下。

最后,修改~/.bashrc文件,在其中添加如下两行:

export SCALA_HOME=/home/dummy/.scala/scala-2.9.2
export PATH=$PATH:$SCALA_HOME/bin

运行命令source .bashrc以使配置立即生效。这时候在命令行中输入scala,即可进入scala的交互式界面,说明scala安装成功。

 

下面具体介绍Spark的安装过程

(1)从下载页面下载Spark 0.6.1,得到压缩文件spark-0.6.1-sources.tgz。

 (2)使用如下命令解压压缩文件,得到文件夹spark-0.6.1

tar zxvf spark-0.6.1-sources.tgz

  (3)使用如下命令移动并重命名文件夹spark-0.6.1。

mv spark-0.6.1 ~/spark

接下来使用<spark>来指代~/spark

    (4) 进入<spark>,修改project/SparkBuild.scala文件,找到HADOOP_VERSION一行,修改为你集群中安装的Hadoop版本。我使用的Hadoop版本为0.20.205.0。修改如下:

val HADOOP_VERSION = "0.20.205.0"

  (5)在<spark>目录下,运行如下命令来build spark

sbt/sbt package

  (6)修改<spark>/conf/spark_env.sh文件,配置spark集群环境。我主要配置了五个参数,其中包括JDK的安装目录,Scala的安装目录,mesos库的位置,每个slave结点最大内存使用量和Java虚拟机中有关垃圾回收的日志开启信息。具体配置如下所示:

#!/usr/bin/env bash

# This file contains environment variables required to run Spark. Copy it as
# spark-env.sh and edit that to configure Spark for your site. At a minimum,
# the following two variables should be set:
# - MESOS_NATIVE_LIBRARY, to point to your Mesos native library (libmesos.so)
# - SCALA_HOME, to point to your Scala installation
export JAVA_HOME=/home/dummy/.java/jdk1.6.0_33
export SCALA_HOME=/home/dummy/.scala/scala-2.9.2
export MESOS_NATIVE_LIBRARY=/home/dummy/mesos/lib/libmesos.so


# If using the standalone deploy mode, you can also set variables for it:
# - SPARK_MASTER_IP, to bind the master to a different IP address
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much memory to use (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT
#
# Finally, Spark also relies on the following variables, but these can be set
# on just the *master* (i.e. in your driver program), and will automatically
# be propagated to workers:
# - SPARK_MEM, to change the amount of memory used per node (this should
#   be in the same format as the JVM's -Xmx option, e.g. 300m or 1g)
# - SPARK_CLASSPATH, to add elements to Spark's classpath
# - SPARK_JAVA_OPTS, to add JVM options
# - SPARK_LIBRARY_PATH, to add extra search paths for native libraries.
export SPARK_MEM=2300m
export SPARK_JAVA_OPTS="-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps"

   (7)将<spark>目录拷贝到主结点和所有从结点的相同路径下,在mesos上安装Spark就算完成了。

 

   (8) 在使用Spark提供的框架编写程序之前,要在<spark>中运行如下命令,生成开发所需要的类库。

sbt/sbt assembly

运行命令之后,会在目录<spark>/core/target中生成一个jar包spark-core-assembly-0.6.0.jar将该jar包添加到开发程序的lib目录下,这样程序编译的时候才不会报各种语法错误。

     (9) 如果不使用run脚本运行自己编写的程序,<spark>/conf/spark_env.sh是不会自动运行的,程序会抛出下面的问题。spark_env.sh中会导出若干个环境变量,对于Spark程序的运行至关重要,因此需要在运行程序前先运行spark_env.sh脚本。如果使用<spark>目录下的run脚本运行程序则不会出现问题,这是因为脚本开始就先执行了spark_env.sh。

Failed to load native Mesos library from /home/dummy/.java/jdk1.6.0_45/jre/lib/a
md64/server:/home/dummy/.java/jdk1.6.0_45/jre/lib/amd64:/home/dummy/.java/jdk1.6
.0_45/jre/../lib/amd64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/
lib
java.lang.UnsatisfiedLinkError: no mesos in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
        at java.lang.Runtime.loadLibrary0(Runtime.java:823)
        at java.lang.System.loadLibrary(System.java:1028)
        at org.apache.mesos.MesosNativeLibrary.load(MesosNativeLibrary.java:46)
        at spark.SparkContext.<init>(SparkContext.scala:174)
        at spark.SparkContext.<init>(SparkContext.scala:77)
        at PageRank$.main(PageRank.scala:79)
        at PageRank.main(PageRank.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClass
Loader.scala:78)
        at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoade
r.scala:24)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaC
lassLoader.scala:88)
        at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scal
a:78)
        at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLo
ader.scala:101)
        at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:33)
        at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:40)
        at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala
:56)
        at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:80)
        at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:89)
        at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

 

接下来就可以使用Scala语言以及Spark提供的API来开发分布式应用了,具体过程在接下来的文章中会讲到。