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 ...
随机推荐
- 一个简易的PHP读取CSV文件的方法
1. 思路:先打开文件,读取出文件有多少行,然后逐行读取数据放入一个数组中 public function read_csv_lines($csv_file = '', $lines = 0, $of ...
- 数据库 | Redis 缓存雪崩解决方案
Redis 雪崩 缓存层承载着大量的请求,有效保护了存储层.但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景. 解决缓存雪崩,可以从 ...
- SRCNN代码分析
代码是作者页面上下载的matlab版.香港中文大学汤晓鸥教授.Learning a Deep Convolutional Network for Image Super-Resolution. htt ...
- easyUI之Accordion(分类)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- mock的使用
mock的重要性 mock就是对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建的方法.项目开发和测试过程中,遇到以下的情况时,就需要模拟结果返回. 1.当另一方接口或服务还未完成,阻碍项 ...
- python之scrapy爬取jingdong招聘信息到mysql数据库
1.创建工程 scrapy startproject jd 2.创建项目 scrapy genspider jingdong 3.安装pymysql pip install pymysql 4.set ...
- GWO(灰狼优化)算法MATLAB源码逐行中文注解(转载)
以优化SVM算法的参数c和g为例,对GWO算法MATLAB源码进行了逐行中文注解. tic % 计时器 %% 清空环境变量 close all clear clc format compact %% ...
- Jenkins权限设计错误解决办法
https://www.cnblogs.com/yangxia-test/p/4368778.html https://blog.csdn.net/xlyrh/article/details/5138 ...
- PJzhang:python基础进阶的10个疗程-three
猫宁!!! 参考:北京理工大学-python程序语言设计 第3节:基本数据类型 默写代码的重要性. 保留字一定要全部都会默写,不能有错. pow(x,y),计算x的y次方,整数没有大小限制 整数进制 ...
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
[VS开发][编程开发][C/C++开发]结构体中的数组与指针的内存分配情况说明 标签:[VS开发] [编程开发] 主要是疑惑在结构体定义的数组的内存空间与指针动态分配的内存空间,在地址上连续性.以及 ...