搭建Spark源码研读和代码调试的开发环境

Note:git

环境的基本配置能够参考我这里转载的这篇文章,固然我本身尝试的时候仍是会出现其它的问题,若是有,那么参考下面两篇文章的案例:github

https://blog.51cto.com/wangyuguo/1981837 shell

https://www.mail-archive.com/search?l=user@spark.apache.org&q=subject:%22Build+error%22&o=newest&f=1 apache

搞定以后,终于就能够抛开为了写业务而写业务Spark代码的烦恼,静静地研究Spark的底层原理吧!intellij-idea




转载自https://github.com/linbojin/spark-notes/blob/master/ide-setup.mdmaven

搭建Spark源码研读和代码调试的开发环境ide

工欲善其事,必先利其器,第一篇笔记介绍如何搭建源码研读和代码调试的开发环境。 一些必要的开发工具,请自行提早安装:工具

  • scala 2.11.8开发工具

  • sbt 0.13.12测试

  • maven 3.3.9

  • git 2.10.2

  • IntelliJ IDEA 2016.3 (scala plugin)

本人使用macOS 10.12,全部笔记都基于这个系统,可是其余系统也能够很容易找到对应的解决方案,好比IDE的快捷键。

源码获取与编译

从Github上获取Spark源码

能够直接从Spark官方Github仓库拉取。本系列笔记基于Spark 2.1.0这个版本,因此先checkout这个tag,再进行以后的步骤:

$ git clone git@github.com:apache/spark.git
$ cd spark
$ git tag
$ git checkout v2.1.0
$ git checkout -b pin-tag-210

若是想要push本身的commits,也能够fork到本身的Github帐号下,再拉取到本地,能够参考我以前的文章:Reading Spark Souce Code in IntelliJ IDEA

编译Spark项目

参考官方文档,编译很简单,这里使用4个线程,跳过tests,以此加速编译。这个编译会产生一些必要的源代码,如Catalyst项目下的,因此是必要的一步:

$ ./build/mvn -T 4 -DskipTests clean package# 编译完成后,测试一下
$ ./bin/spark-shell

packageAndRun

源码导入与代码运行

导入源码到Intellij IDEA 16

如今IDEA对scala支持已经比较完善,导入Spark工程很是简单:

Menu -> File -> Open -> {spark dir}/pom.xml -> Open as Project

openIDE

运行实例代码

导入工程后,介绍一下如何运行Spark项目自带的实例代码,在{spark dir}/examples/目录下,这里以LogQuery为例:

command + o -> 输入LogQuery打开

LogQueryCode

1. 配置运行参数:

Menu -> Run -> Edit Configurations -> 选择 + -> Application

参数配置以下: runConfig VM options: -Dspark.master=local表明使用本地模式运行Spark代码,也能够选择其余模式。 保存配置后,能够看到LogQuery在运行选项里了: runLogQuery

2. 添加缺失的flume sink源代码

首次运行LogQuery会报错,由于IDE找不到flume依赖的部分源码: flumeSinkError 解决方案以下:

Menu -> File -> Project Structure -> Modules -> spark-streaming-flume-sink_2.11 -> Sources

  1. 把 target目录加入Sources(点击蓝色Sources)

  2. 把子目录sink也加入Sources

参考下图,注意右边的Source Folders列表: moduleFlumeSink

3. 添加运行依赖的jars

再次运行,此次会花费比较长的时间,由于已经能够成功编译LogQuery啦,可是仍是没能运行成功,报错以下: missDepJars 不要慌,这说明你的代码编译已经成功啦,运行出错的缘由是,运行Spark App通常都是经过spark-submit命令,把你的jar运行到已经安装的Spark环境里,也就是全部的Spark依赖都已经有啦,如今你用IDE的方式,就会缺乏依赖。

解决方案以下:

Menu -> File -> Project Structure -> Modules -> spark-examples_2.11 -> Dependencies 添加依赖 jars -> {spark dir}/spark/assembly/target/scala-2.11/jars/

addDepJars

有两点须要注意:

  • jars/*.jar: 这些依赖jars是在第一步编译打包Spark项目的时候产生的,若是这个目录是空的,或者修改了源代码想更新这些jars,能够用一样的命令再次编译Spark:

$ build/mvn -T 4 -DskipTests clean package
  • 从上图中右侧的Scope一栏能够看到,基本上全部依赖jars都是Provided,也就是说默认都是提供的,由于默认都是用spark-submit方式运行Spark App的。

4. 成功运行实例代码

终于再次运行LogQuery的时候,能够看到输出啦: runLogQuerySuccessfully

单步调试源代码

千辛万苦地终于让实例代码在IDE里跑起来了,是否是颇有成就感。其实作了那么多的铺垫工做,在IDE里面运行代码的最大福利是能够单步调试! 很简单,选择断点,而后Run -> Debug,能够看到中间变量值等等,其余的自行探索吧: debug

相关文章
相关标签/搜索