第5章 Spark开发环境配置及流程

通过前⾯的介绍,相信读者已经对Spark的内部机制有了⼀定的了解,本章将介绍如何在Spark中开发应⽤程序,以及如何进⾏程序的编译和调试。在编写Spark应⽤程序之前,需要安装和配置开发环境,⼀般可以选择Intellij或Eclipse进⾏开发和调试,使⽤SBT编译项⽬。

5.1 Spark应⽤开发环境配置

Spark的开发可以通过Intellij或者Eclipse IDE进⾏,在环境配置的开始阶段,还需要安装相应的Scala插件。

5.1.1 使⽤Intellij开发Spark程序

下⾯介绍如何使⽤Intellij IDEA构建Spark开发环境和源码阅读环境。由于Intellij对Scala的⽀持更好,所以⽬前Spark开发团队使⽤Intellij作为开发环境。

1.配置开发环境

(1)安装JDK

⽤户可以⾃⾏安装JDK6、JDK7。官⽹地址为: http://www.oracle.com/technetwork/java/javase/downloads/index.html

下载后,如果在Windows下直接运⾏安装程序,则⾃动配置环境变量,安装成功后,在CMD的命令⾏下输⼊Java,如有Java版本的⽇志信息提⽰,则证明安装成功。

如果在Linux下安装,下载JDK包解压缩后,还需要配置环境变量。

在/etc/profile⽂件中,配置环境变量这样程序就能找到JDK的安装路经:

export JAVA_HOME=/usr/java/jdk1.6.0_27 export JAVA_BIN=/usr/java/jdk1.6.0_27/bin

export PATH=$PATH:$JAVA_HOME/bin

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME JAVA_BIN PATH CLASSPATH

(2)安装Scala

Spark对Scala的版本有约束,⽤户可以在Spark的官⽅下载界⾯看到相应的Scala版本号。下载指定的Scala包,官⽹地址为: http://www.scala-lang.org/download/。

(3)安装Intellij IDEA

⽤户可以下载安装最新版本的Intellij,官⽹地址为: http://www.jetbrains.com/idea/download/。

⽬前Intellij最新的版本中已经可以⽀持新建sbt⼯程,安装Scala插件可以很好地⽀持Scala开发。

(4)在Intellij中安装Scala插件

在Intellij菜单中选择“Configure”→“Plugins”→“Browse repositories”命令,在弹出的界⾯中输⼊“Scala”搜索插件(⻅图5-1),然后点击相应安装按钮进⾏安装,重启Intellij使配置⽣效。

2.配置Spark应⽤开发环境

1)在Intellij IDEA中创建Scala Project,名称为SparkTest。

2)选择菜单中的“File”→“project structure”→“Libraries”,然后选择“+”,导⼊spark-assembly_2.10-1.0.0-incubating-hadoop2.2.0.jar。

只需导⼊上述Jar包即可,该包可以通过sbt/sbt assembly命令⽣成,这个命令相当于将Spark的所有依赖包和Spark源码打包为⼀个整体。

在assembly/target/scala-2.10.4/⽬录下⽣成spark-assembly-1.0.0- incubating-hadoop2.2.0.jar。

3)如果IDE⽆法识别Scala库,则需要以同样⽅式将Scala库的jar包导⼊,之后可以开始开发Scala程序,如图5-2所⽰。本例将Spark默认的⽰例程序SparkPi复制进⽂件。

3.运⾏Spark程序

(1)本地运⾏

编写完Scala程序后,可以直接在Intellij中以本地(local)模式运⾏(⻅图5-3),⽅法如下。

注意,设置Program arguments中参数为local。

在Intellij中点击Run/Debug Configuration按钮,在其下拉列表选择Edit Configurations选项。在Run输⼊选择界⾯中,如图5-3所⽰,在输⼊框Program arguments中输⼊main函数的输⼊参数local,即为本地单机执⾏Spark应⽤。然后右键选择需要运⾏的类,点击Run运⾏Spark应⽤程序。

(2)在集群上运⾏Spark应⽤Jar包

如果想把程序打成Jar包,通过命令⾏的形式在Spark集群中运⾏,可以按照以下步骤操作。

1)选择“File”→“Project Structure”命令,然后选择“Artifact”,单击“+”按钮,选择“Jar”→“From Modules with dependencies”,如图5-4所⽰。

选择Main函数,在弹出的对话框中选择输出Jar位置,并单击“OK”按钮。

在图5-4中点击From mudules with dependencies后将会出现如图5-5所⽰的输⼊框,在其中的输⼊框中选择需要执⾏的Main函数。

在图5-5所⽰的界⾯中单击OK按钮后,在图5-6所⽰的对话框中通过OutPut layout中的“+”选择依赖的Jar包。

2)在主菜单中选择“Build”→“Build Artifact”命令,编译⽣成Jar包。

3)在集群的主节点,通过下⾯命令执⾏⽣成的Jar包SparkTest.jar。

java -jar SparkTest.jar

5.1.2 使⽤Eclipse开发Spark程序

下⾯介绍如何使⽤Eclipse配置和开发Spark的环境,⽤户可以在Windows或者Linux环境下使⽤Eclipse进⾏开发。

1.环境配置

与Intellij配置环境⼀样,需要⽤户下载安装JDK和Scala。前⽂已详细介绍,这⾥不再赘述。

1)下载Eclipse Scala IDE插件,官⽹地址为http://scalaide.org/download/sdk.html,可在官⽹中⾃⾏下载安装。

2)下载Eclipse[1],官⽹地址为http://www.eclipse.org/downloads/。

2.安装Scala插件

1)将Eclipse Scala IDE插件中的features和plugins两个⽬录下的所有⽂件复制到Eclipse解压后对应的根⽬录中。重启Eclipse,单击Eclipse右上⾓⽅框按钮,如图5-7所⽰,在弹出的Open Perspective对话框中查看是否有“Scala”⼀项,如果有则直接单击打开。

2)在Eclipse中,选择Help按钮,然后点击Install New Software命令,在打开的输⼊框⾥填⼊http://download.scalaide.org/sdk/e38/scala29/stable/site,并按回⻋键,可看到以下内容(⻅图5-8中加框突出部分),选择Scala IDE for Eclipse和Scala IDE for Eclipse development support两项进⾏安装即可,如图5-8所⽰。

3)直接下载Scala IDE,可以在官⽹http://scala-ide.org/下载。现在的ScalaIDE中默认⾃带了Eclipse,⽤户可以直接使⽤。

3.开发Spark程序

1)在安装好Scala插件的Eclipse中,选择File→New→Other命令,在弹出的New窗⼝中选择Scala Wizard→Scala Project命令,创建Scala项⽬,如图5-9所⽰。

2)右击新建⼯程,在快捷菜单中选择Properties命令,在弹出的窗⼝(⻅图5-10)中依次选择Java Build Path→Libraties→Add External JARs即可,导⼊assembly/target/scala-2.9.3/⽬录下的spark-assembly- 1.0.0-incubating-hadoop2.2.0.jar(这个包可以通过sbt/sbt assembly⽣成,也可以在预编译版本的Spark中找到)。

3)在⼯程中创建⼀个Scala对象(Object),命名为WordCount,在Name后的输⼊框填⼊WordCount,如图5-11所⽰。

WordCount是⼀个测试程序,统计输⼊的词频,读者可以参考第6章来了解。

在SparkTest⼯程中,右击WordCount.scala,在弹出的快捷菜单中选择Export命令,然后在弹出的窗⼝中选择Java→JAR File命令,将⽂件命名为WordCount。最后⽣成WordCound.jar的可执⾏Jar包。

或者直接在SparkContext中将第⼀个参数配置为local,然后直接在Eclipse点击run按钮,本地运⾏程序。

提⽰ Java语⾔开发Spark程序。

将Spark开发程序包spark-assembly-1.0.0-incubating-hadoop2.2.0.jar作为第三⽅依赖库。由于Scala也是运⾏在JVM之上,并且可以和Java合编程,所以可以按原有⽅式开发Java程序并调⽤Spark中的API。

[1] 下载的Eclipse版本⼀定要与Eclipse Scala IDE插件版本⼀致。

5.1.3 使⽤SBT构建Spark程序

⽤户也可以直接使⽤SBT构建Spark应⽤。在这个应⽤中,以统计包含“Hello”字符的⾏数为案例。

(1)构建开发环境

1)下载并解压Spark 1.0.0程序包或者通过git clone https://github.com/apache/spark命令将项⽬克隆到Spark根⽬录。

2)运⾏sbt/sbt assembly构建项⽬。

3)为了使⽤SBT成功构建Spark,预先安装SBT。

(2)开发应⽤程序

在构建Spark以后,就可以开始开发应⽤了。

1)创建⽬录mkdir HelloWorld。

2)创建⼀个.sbt⽂件,在⽬录HelloWorld中创建simple.sbt⽂件。

3)在.sbt⽂件中加⼊如下配置项配置应⽤名,版本和依赖等信息。

name := "HelloWorld 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/
(3)创建代码⽂件
HelloWorld/src/main/scala/HelloWorld.scala
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
object HelloWorld {
def main(args: Array[String]) {
val logFile = "src/data/sample.txt"
val sc = new SparkContext("local", "Simple App", "/path/to/spark-1.0.0-
incubating",
List("target/scala-2.10/simple-project_2.10-1.0.jar"))
val logData = sc.textFile(logFile, 2).cache()
val numHello = logData.filter(line => line.contains("Hello")).count()
println("Lines with the: %s".format(numHello))
}
}
(4)运⾏程序
1)程序创建后,返回到HelloWorld根⽬录。
2)运⾏sbt package进⾏构建与打包。
3)运⾏sbt run,系统执⾏构建好的程序。
5.1.4 使⽤Spark Shell开发运⾏Spark程序

因为运⾏Spark Shell时,会默认创建⼀个SparkContext,命名为sc,所以不需要在Spark Shell创建新的SparkContext。在运⾏Spark Shell之前,可以设定参数MASTER指定Spark应⽤提交MASTER指向的相应集群或者本地模式执⾏。可以通过参数ADD_JARS将JARS添加到classpath中。

如果希望spakr-shell在本地通过4核的CPU运⾏,需要以如下⽅式启动。

$MASTER=local[4] ./spark-shell

这⾥的4是指启动4个⼯作线程。

如果要添加JARS,可以⽤如下⽅法实现:

$MASTER=local[4] ADD_JARS=code.jar ./spark-shell

在Spark Shell中,输⼊下⾯代码,读取dir⽂件,以输出⽂件中有多少数据项。

scala>val text=sc.textFile("dir") scala>text.count

按回⻋键,即可运⾏Shell中的程序。

5.2 远程调试Spark程序

本地调试Spark程序和传统的调试单机的Java程序基本⼀致,读者可以参照原来的⽅式调试,关于单机调试本书暂不介绍。对于远程调试服务器上的Spark代码,⾸先确保在服务器和本地的Spark版本⼀致。需按前⽂介绍的⽅法预先安装好JDK和git。

1.编译Spark

在服务器端和本地计算机下载Spark项⽬。

通过下⾯命令克隆⼀份Spark源码。

git clone https://github.com/apache/spark

然后针对指定的Hadoop版本进⾏编译。配置代码如下:

SPARK_HADOOP_VERSION=2.3.0 sbt/sbt assembly

2.在服务器端的配置

1)根据相应的Spark配置指定版本的Hadoop并启动Hadoop。

2)对编译好的Spark进⾏配置,在conf/spark-env.sh⽂件中进⾏如下配置。下⾯代码配置了Spark调试所需的Java参数。

export SPARK_JAVA_OPTS=" -agentlib:jdwp=transport=dt_socket,server=y, suspend=y,address=9999"

其中suspend=y表⽰设置为需要挂起的模式。这样,当启动Spark的作业时,程序会⾃动挂起,等待本地的IDE附加(attach)到被调试的应⽤程序上。address后接的是开放等待连接的端⼝号。

3.启动Spark集群和应⽤程序

1)启动Spark集群。

./sbin/start-all.sh

2)启动需要调试的程序,以Spark中⾃带的HdfsWordCount为例。

MASTER=spark://10.10.1.168:7077 ./bin/run-example org.apache.spark.examples.streaming.HdfsWordCount hdfs://localhost: 9000/test/test.txt

执⾏后程序挂起,并等待本地的Intellij进⾏连接,如图5-12所⽰。

4.配置本地IDE

配置并连接服务器端挂起的程序。

在Intellij中点击run→edit configuration,在弹出的Run/Debug Configuration界⾯中选择remote,在默认配置中将端⼝号Port设置为9999,将主机IP地址的Host改为服务器的地址10.10.1.168,同时⽤选择Debugger mode为Attach(附加)⽅式,如图5-13所⽰。

选择附加⽅式后,在程序中设置断点即可进⾏调试。

更多推荐