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来开发分布式应用了,具体过程在接下来的文章中会讲到。