Spark 现在无疑是大数据领域最热门的技术之一,读者很容易搜索到介绍如何应用 Spark 技术的文章,但是作为开发人员,在了解了应用的概念之后,更习惯的是打开开发环境,开发一些应用来更深入的学习 spark 知识,在遇到问题的时候,也希望能够深入调试 Spark 源代码来解决问题。但是由于 Spark 技术本身较新,对于初学者,在构建开发调试环境的过程中,总会遇到这样那样的问题。而其使用的 Scala 语言,SBT 构建工具相对于 Java 语言,Maven 构建工具而言,也比较小众,因些在 Web 上能够参考的信息相对也比较少。本文结合作者的实践,从 Spark 的源码开始编译整个项目,同时给出了一些在编译过程中可能出现的问题,供使用参考。文中各步骤展示的编译方法主要用于方便学习 Spark 源码,若仅需要编写 Spark 应用则不需要如此繁复的流程,具体引用方法可参考最后一章。
回页首
回页首
该小节中使用的各项工具分别为:Windows 7+Eclipse Java EE 4.4.2+Scala 2.10.4+Sbt 0.13.8+Maven3.3.3,测试的 Spark 版本为 1.4.0。
如图 1 所示,选择菜单项 Help->Install new software,添加站点 http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site,选择安装 Scala IDE for Eclipse 以及 Scala IDE Plugins。
图 1. 配置 IDE
点击查看大图
关闭 [x]
对于标准版 Eclipse,还需要安装单独的 Maven 插件。
出于配置简便考虑,也可以使用 Scala 官方提供的已将所有依赖打包好的 Scala IDE。
特别的,由于项目本身存在一些错误,请先暂时关闭 Project->Build Automatically 的功能以节省时间。
创建空目录,执行如下语句:git clone https://github.com/apache/spark.git
除了使用 git 指令之外,也可以从 Spark 的 Github 页面下载打包好的源代码。
进入源代码根目录,执行如下语句:sbt eclipse。Sbt 执行期间会下载 Spark 所需要的所有 jar 包,因此该步骤会花费很长的时间。其中有一些 jar 包需要使用网络代理等方法才能下载。执行成功之后会有如图 2 的输出。
图 2. 转化为 Eclipse 项目
选择菜单项 File->Import,并选择 General->Existing Projects into Workspace,项目的根路径选择源代码的根路径,导入所有项目(共有 25 个)。
进入 Preference->Scala->Installations,添加机器上安装的 Scala 2.10.4(选择 lib 目录)。由于该版本 Spark(1.4.0)是在 Scala 2.10.4 的环境下编写的,需要在 Eclipse 中修改项目使用的 Scala 版本。方法为:全选项目,右键选择 Scala->Set the Scala Installation 并选择相应的 Scala 版本。如图 3 所示。
图 3. 修改 Scala 版本
右键选择 old-deps 项目,选择 Scala->Add Scala Library to Build Path。
首先将源代码根目录中的 scalastyle-config.xml 文件复制到 spark-streaming-flume-sink 项目根目录中,而后在 Eclipse 中打开该项目,右键选择 pom.xml 文件,选择 Run as->Maven install。如图 4 所示。
图 4.Maven install
运行成功之后 console 会输出如图 5 内容。
图 5.Maven install 成功
由于源代码的包设置有错误,为此需要将类文件移至正确的包中。如图 6 所示。
图 6. 修改包错误
对于 spark-sql 项目,分别选择 src/test/java 中的 test.org.apache.spark.sql 以及 test.org.apache.spark.sql.sources 包中的所有类,右键选择 Refactor->Move,移动至 org.apache.spark.sql 以及 org.apache.spark.sql.sources 包。
对于 spark-hive 项目,分别选择 src/test/java 中的 test.org.apache.spark.sql.hive 以及 test.org.apache.spark.sql.hive.execution 包中的所有类,移动至 org.apache.spark.sql.hive 以及 org.apache.spark.sql.hive.execution 包。
打开 Project->Build Automatically 功能,等待所有项目编译成功。
将 core 项目中的 src->main->resources->org 文件夹拷贝到 examples 项目中的 target->scala-2.10->classes 中。而后执行 examples 项目中的 org.apache.spark.examples.SparkPi 程序,并设置其 jvm 参数为-Dspark.master=local,若最后输出如图 7 结果则说明安装成功。
图 7.SparkPi 运行结果
回页首
若已将 scala version 设置为 2.10.4 仍发生版本错误,可以尝试 Project->Clean 以重新编译该项目。
该错误为编码原因导致,将 Workspace 的编码设置为 UTF-8 即可。如图 8 所示。
图 8. 设置 Workspace 编码
可以尝试 Project->Clean 以重新编译。
回页首
该小节中使用的各项工具分别为:Windows 7+IntelliJ IDEA Ultimate 14.1.3+Scala 2.10.4+Sbt 0.13.8+Maven3.3.3,测试的 Spark 版本为 1.4.0。
开启 IntelliJ 之后选择 Import Project,如图 9 所示。
图 9. 选择 Import Project
而后选择 Spark 源代码根目录,并将其导入为 SBT 项目,如图 10 所示。
图 10. 作为 SBT 项目导入
在之后的过程中 SBT 过程将会自动进行,下载作为依赖的 jar 包,期间需要使用 vpn 等方式以完成下载。
如图 11,在 IntelliJ 的 Maven view 中导入源代码根目录中的 pom.xml 文件,而后在 Maven view 中选择 spark-streaming-flume-sink 项目中的 install 并执行。
图 11. 导入 pom.xml
与 Eclipse 的步骤同理,对于 spark-sql 项目,分别选择 src/test/java 中的 test.org.apache.spark.sql 以及 test.org.apache.spark.sql.sources 包中的所有类,右键选择 Refactor->Move,移动至 org.apache.spark.sql 以及 org.apache.spark.sql.sources 包。
对于 spark-hive 项目,分别选择 src/test/java 中的 test.org.apache.spark.sql.hive 以及 test.org.apache.spark.sql.hive.execution 包中的所有类,移动至 org.apache.spark.sql.hive 以及 org.apache.spark.sql.hive.execution 包。
执行 examples 项目中的 org.apache.spark.examples.SparkPi 程序,并设置其 jvm 参数为-Dspark.master=local,若最后输出如图 12 结果则说明安装成功。
图 12.SparkPi 运行结果
回页首
有可能是由于 Build 不完全导致的,选择 Build->Rebuild Project 即可。
右键点击 examples 项目,选择 Open Module Settings,打开 dependencies 标签页,添加下述目录:network/shuffle/target/scala-2.10/classes, network/common/target/scala-2.10/classes, unsafe/target/scala-2.10/classes。
回页首
如引言所述,在编写 Spark 应用时一般不会从源码编译开始,实际过程中我们可以采用如下两种方法来引用 Spark 类库:
项目转换为 Maven 项目,并向其 pom.xml 文件中加入如下依赖即可使用 spark 核心包:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.4.0</version>
</dependency>
如果要使用其余的 Spark 包(如 MLlib),可以通过查询 Spark 的 Maven repository 获取依赖名并加入 pom.xml。
回页首
本文介绍了常用开发工具环境中如何快速构建 Spark 源代码和搭建应用的开发调试环境,使读者能够避免构建开发调试环境中的各种问题从而专注深入的研究 Spark 的核心技术。在此基础下,笔者还会在后续的文章中结合 Spark 的应用示例分析来帮助读者快速的理解和应用 Spark Stream,Spark Graphx,Spark MLlib 等组件。