Spark 源码和应用开发环境的构建
引言
Spark 现在无疑是大数据领域最热门的技术之一,读者很容易搜索到介绍如何应用 Spark 技术的文章,但是作为开发人员,在了解了应用的概念之后,更习惯的是打开开发环境,开发一些应用来更深入的学习 spark 知识,在遇到问题的时候,也希望能够深入调试 Spark 源代码来解决问题。但是由于 Spark 技术本身较新,对于初学者,在构建开发调试环境的过程中,总会遇到这样那样的问题。而其使用的 Scala 语言,SBT 构建工具相对于 Java 语言,Maven 构建工具而言,也比较小众,因些在 Web 上能够参考的信息相对也比较少。本文结合作者的实践,从 Spark 的源码开始编译整个项目,同时给出了一些在编译过程中可能出现的问题,供使用参考。文中各步骤展示的编译方法主要用于方便学习 Spark 源码,若仅需要编写 Spark 应用则不需要如此繁复的流程,具体引用方法可参考最后一章。
环境要求
- 系统:Windows/Linux/Mac OS
- IDE:Eclipse/IntelliJ
- 其他依赖:Scala,Sbt,Maven
Eclipse 下开发调试环境的配置
该小节中使用的各项工具分别为:Windows 7+Eclipse Java EE 4.4.2+Scala 2.10.4+Sbt 0.13.8+Maven3.3.3,测试的 Spark 版本为 1.4.0。
1.配置 IDE:
如图 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

对于标准版 Eclipse,还需要安装单独的 Maven 插件。
出于配置简便考虑,也可以使用 Scala 官方提供的已将所有依赖打包好的 Scala IDE。
特别的,由于项目本身存在一些错误,请先暂时关闭 Project->Build Automatically 的功能以节省时间。
2.下载 Spark 源代码:
创建空目录,执行如下语句:git clone https://github.com/apache/spark.git
除了使用 git 指令之外,也可以从 Spark 的 Github 页面下载打包好的源代码。
3.将源码转化为 Eclipse 项目:
进入源代码根目录,执行如下语句:sbt eclipse。Sbt 执行期间会下载 Spark 所需要的所有 jar 包,因此该步骤会花费很长的时间。其中有一些 jar 包需要使用网络代理等方法才能下载。执行成功之后会有如图 2 的输出。
图 2. 转化为 Eclipse 项目

4.导入项目至 Eclipse:
选择菜单项 File->Import,并选择 General->Existing Projects into Workspace,项目的根路径选择源代码的根路径,导入所有项目(共有 25 个)。
5.修改 Scala 版本:
进入 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 版本

6.为 old-deps 项目添加 Scala Library:
右键选择 old-deps 项目,选择 Scala->Add Scala Library to Build Path。
7.Maven install 以生成 spark-streaming-flume-sink 所需要的类:
首先将源代码根目录中的 scalastyle-config.xml 文件复制到 spark-streaming-flume-sink 项目根目录中,而后在 Eclipse 中打开该项目,右键选择 pom.xml 文件,选择 Run as->Maven install。如图 4 所示。
图 4.Maven install

运行成功之后 console 会输出如图 5 内容。
图 5.Maven install 成功

8.修改 spark-sql 与 spark-hive 的包错误:
由于源代码的包设置有错误,为此需要将类文件移至正确的包中。如图 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 包。
9.编译所有项目:
打开 Project->Build Automatically 功能,等待所有项目编译成功。
10.检查是否安装成功:
将 core 项目中的 src->main->resources->org 文件夹拷贝到 examples 项目中的 target->scala-2.10->classes 中。而后执行 examples 项目中的 org.apache.spark.examples.SparkPi 程序,并设置其 jvm 参数为-Dspark.master=local,若最后输出如图 7 结果则说明安装成功。
图 7.SparkPi 运行结果

可能遇到的问题(Eclipse)
1.Scala version 错误:
若已将 scala version 设置为 2.10.4 仍发生版本错误,可以尝试 Project->Clean 以重新编译该项目。
2.spark-catalyst 错误:
该错误为编码原因导致,将 Workspace 的编码设置为 UTF-8 即可。如图 8 所示。
图 8. 设置 Workspace 编码

3.spark-sql 及 spark-hive source not found 错误:
可以尝试 Project->Clean 以重新编译。
IntelliJ 下开发调试环境的配置
该小节中使用的各项工具分别为:Windows 7+IntelliJ IDEA Ultimate 14.1.3+Scala 2.10.4+Sbt 0.13.8+Maven3.3.3,测试的 Spark 版本为 1.4.0。
1.导入项目:
开启 IntelliJ 之后选择 Import Project,如图 9 所示。
图 9. 选择 Import Project

而后选择 Spark 源代码根目录,并将其导入为 SBT 项目,如图 10 所示。
图 10. 作为 SBT 项目导入

在之后的过程中 SBT 过程将会自动进行,下载作为依赖的 jar 包,期间需要使用 vpn 等方式以完成下载。
2.执行 Maven install:
如图 11,在 IntelliJ 的 Maven view 中导入源代码根目录中的 pom.xml 文件,而后在 Maven view 中选择 spark-streaming-flume-sink 项目中的 install 并执行。
图 11. 导入 pom.xml

3.修改 spark-sql 与 spark-hive 的包错误:
与 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 包。
4.测试 SparkPi:
执行 examples 项目中的 org.apache.spark.examples.SparkPi 程序,并设置其 jvm 参数为-Dspark.master=local,若最后输出如图 12 结果则说明安装成功。
图 12.SparkPi 运行结果

可能遇到的问题(IntelliJ)
1.运行 SparkPi 时出现 TestSQLContext 的 Assertion 错误:
有可能是由于 Build 不完全导致的,选择 Build->Rebuild Project 即可。
2.运行 SparkPi 时出现 NoClassDefFoundError:
右键点击 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 类库:
- 在项目的 classpath 中添加 spark-assembly.jar,而后则按照正常的开发流程使用 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 等组件。
本文来自:https://www.ibm.com/developerworks/cn/opensource/os-cn-spark-build/#ibm-pcon
参考资料
学习
- Useful Developer Tools: Spark 工具配置。
- 查看Scala 官网,了解更多关于 Scala 语言的内容。
- 查看SBT官网,了解更多关于 SBT 工具的内容。
- 查看Maven官网,了解更多关于 Maven 的内容。
- 查看Scala-IDE官网,了解更多关于 Scala-IDE 的内容。
- Spark Maven repository: Spark Maven 资源库。
- developerWorks 开源技术主题:查找丰富的操作信息、工具和项目更新,帮助您掌握开源技术并将其用于 IBM 产品。
讨论
- 加入 developerWorks 中文社区,查看开发人员推动的博客、论坛、组和维基,并与其他 developerWorks 用户交流。
Spark 源码和应用开发环境的构建的更多相关文章
- Windows上IDEA搭建最新Spark2.4.3源码调试的开发环境
相信很多同学都想通过阅读一些框架的源码,来提高自己的代码能力,但往往在第一步,搭建环境的时候就碰了壁. 本篇就来介绍下如何在Windows下,将最新版的Spark2.4.3编译,并导入到IDEA编译器 ...
- odoo10源码win系统开发环境安装图文教程
前言 odoo10的源码安装教程不太完整或对新手不够友好,本新手再次整合出一份友好的新手教程(老鸟慎入) 准备工作 一个干净的window系统(事先没有其他python环境的系统)如果怕系统污染可以先 ...
- 搭建Spark源码研读和代码调试的开发环境
转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.md 搭建Spark源码研读和代码调试的开发环境 工欲善其事,必先利其 ...
- emacs+ensime+sbt打造spark源码阅读环境
欢迎转载,转载请注明出处,徽沪一郎. 概述 Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为.不巧的是,当前java社区中很流行的ide如eclips ...
- Spark源码分析环境搭建
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3868718.html 本文主要分享一下如何构建Spark源码分析环境.以前主要使用eclipse来阅读源 ...
- Spark源码剖析 - SparkContext的初始化(二)_创建执行环境SparkEnv
2. 创建执行环境SparkEnv SparkEnv是Spark的执行环境对象,其中包括众多与Executor执行相关的对象.由于在local模式下Driver会创建Executor,local-cl ...
- window环境下使用sbt编译spark源码
前些天用maven编译打包spark,搞得焦头烂额的,各种错误,层出不穷,想想也是醉了,于是乎,换种方式,使用sbt编译,看看人品如何! 首先,从官网spark官网下载spark源码包,解压出来.我这 ...
- 编译spark源码及塔建源码阅读环境
编译spark源码及塔建源码阅读环境 (一),编译spark源码 1,更换maven的下载镜像: <mirrors> <!-- 阿里云仓库 --> <mirror> ...
- idea下关联spark源码环境(转)
0.环境: java 1.8 scala 2.11.8 maven 3.5.0 idea 2017 spark 2.2.0 1完成以下配置 java环境变量 scala环境变量 maven setti ...
随机推荐
- 【Mybatis】向MySql数据库插入千万记录 单条插入方式,用时 1h16m30s
本例代码下载:https://files.cnblogs.com/files/xiandedanteng/InsertMillionComparison20191012.rar 相对于批量插入,这种方 ...
- CentOS7设置开机启动方式(图形界面/命令行界面)
CentOS 7由于使用systemd而不是init,所以不能通过修改inittab文件来修改开机启动模式. 先使用ctrl+alt+f2切换到命令行模式,然后输入命令:systemctl set-d ...
- ubuntu下如何使用apt-get安装arm64的交叉编译工具链?
答: sudo apt-get install gcc-aarch64-linux-gnu -y
- NET全控件
NBSI WebSite Injection ReportSite Address: www.xmht.comInject URL: http://www.xmht.com/news.aspx?sty ...
- linux 自动输入用户名和密码 ftp
参考文章: http://blog.sina.com.cn/s/blog_8709e3120101culd.html 方法概括; 1.echo管道 2. 利用重定向操作符command <&l ...
- 创建使用Spring Boot
Spring Boot 创建项目 Spring Initializr 创建完成会自动下载 解压后 Idea导入 修改国内镜像 网络不够强的话停掉自动更新 build.gradle 加上 reposit ...
- HashMap ArrayList 和 List对象的转换
public static void main(String[] args) { List list = new ArrayList<>(); HashMap map = new Hash ...
- OSS上传图片demo
demo整理来源https://help.aliyun.com/document_detail/32011.html /** * 示例说明 * <p> * HelloOSS是OSS Jav ...
- Product - 产品经理 - 内容
特别说明 本文是已读书籍的学习笔记和内容摘要,原文内容有少部分改动,并添加一些相关信息,但总体不影响原文表达. - ISBN: 9787568041591 - https://book.douban. ...
- .Net Core 2.*+ InfluxDB+Grafana+App Metrics实时性能监控
前言 .net core 2.* 实施性能监控 这个工具其实给运维 大大们用起来是更爽的.但是Grafana现在还没有找到中文版. 本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库, ...