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

skxe3313 8年前
   <h2>搭建Spark源码研读和代码调试的开发环境</h2>    <ul>     <li>      <ul>       <li>        <ul>         <li>从Github上获取Spark源码</li>        </ul> </li>       <li>        <ul>         <li>导入源码到Intellij IDEA 16</li>         <li>          <ul>           <li>2. 添加缺失的flume sink源代码</li>           <li>3. 添加运行依赖的jars</li>          </ul> </li>        </ul> </li>      </ul> </li>    </ul>    <p>工欲善其事,必先利其器,第一篇笔记介绍如何搭建源码研读和代码调试的开发环境。 一些必要的开发工具,请自行提前安装:</p>    <ul>     <li>scala 2.11.8</li>     <li>sbt 0.13.12</li>     <li>maven 3.3.9</li>     <li>git 2.10.2</li>     <li>IntelliJ IDEA 2016.3 (scala plugin)</li>    </ul>    <p>本人使用macOS 10.12,所有笔记都基于这个系统,但是其他系统也可以很容易找到对应的解决方案,比如IDE的快捷键。</p>    <h2>源码获取与编译</h2>    <h3>从Github上获取Spark源码</h3>    <p>可以直接从Spark官方Github仓库拉取。本系列笔记基于 <strong>Spark 2.0.2</strong> 这个版本,所以先checkout这个tag,再进行之后的步骤:</p>    <pre>  $ git clone git@github.com:apache/spark.git  $ cd spark  $ git tag  $ git checkout v2.0.2   $ git checkout -b pin-tag-202</pre>    <p>如果想要push自己的commits,也可以fork到自己的Github账号下,再拉取到本地。</p>    <h3>编译Spark项目</h3>    <p>参考官方文档,编译很简单,这里使用4个线程,跳过tests,以此加速编译。这个编译会产生一些必要的源代码,如Catalyst项目下的,所以是必要的一步:</p>    <pre>  $ build/mvn -T 4 -DskipTests clean package  # 编译完成后,测试一下  $ ./bin/spark-shell</pre>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/375342cdee1f73ca7cabca863cca7aed.jpg"></p>    <h2>源码导入与代码运行</h2>    <h3>导入源码到Intellij IDEA 16</h3>    <p>现在IDEA对scala支持已经比较完善,导入Spark工程非常简单:</p>    <p>Menu -> File -> <strong>Open</strong> -> {spark dir}/ <strong>pom.xml</strong> -> <strong>Open as Project</strong></p>    <p><img src="https://simg.open-open.com/show/3209c8aa8948b46b06c26d42ebf8fb62.png"></p>    <h3>运行实例代码</h3>    <p>导入工程后,介绍一下如何运行Spark项目自带的实例代码,在 {spark dir}/examples/ 目录下,这里以 LogQuery 为例:</p>    <p>command + o -> 输入LogQuery打开</p>    <p><img src="https://simg.open-open.com/show/aee0577c3d78766f5eb599eee139d24e.jpg"></p>    <p>1. 配置运行参数:</p>    <p>Menu -> Run -> Edit Configurations -> 选择 + -> Application</p>    <p style="text-align: center;">参数配置如下: <img src="https://simg.open-open.com/show/cb5852e1fd9beebc1b2b5580475920dd.png"></p>    <p>VM options: -Dspark.master=local 代表使用本地模式运行Spark代码,也可以选择其他模式。 保存配置后,可以看到 LogQuery 在运行选项里了:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/3b2eb290e7f90294260b44c8342deced.jpg"></p>    <p>2. 添加缺失的flume sink源代码</p>    <p>首次运行 LogQuery 会报错,因为IDE找不到flume依赖的部分源码: <img src="https://simg.open-open.com/show/3eb7a0f54c552ac402d78071c1e01e77.jpg"> 解决方案如下:</p>    <p>Menu -> File -> Project Structure -> Modules -> spark-streaming-flume-sink_2.11 -> Sources 1. 把 target目录加入Sources(点击蓝色Sources) 2. 把子目录sink也加入Sources</p>    <p style="text-align: center;">参考下图,注意右边的Source Folders列表: <img src="https://simg.open-open.com/show/05cbf9fb36ee4e5e4aedfd9473303103.png"></p>    <p>3. 添加运行依赖的jars</p>    <p>再次运行,这次会花费比较长的时间,因为已经可以成功编译 LogQuery 啦,但是还是没能运行成功,报错如下: <img src="https://simg.open-open.com/show/3b381e0f9e74aa3b7b68a929b8ac0345.jpg"> 不要慌,这说明你的代码编译已经成功啦,运行出错的原因是,运行Spark App一般都是通过 spark-submit 命令,把你的jar运行到已经安装的Spark环境里,也就是所有的Spark依赖都已经有啦,现在你用IDE的方式,就会缺少依赖。</p>    <p>解决方案如下:</p>    <p>Menu -> File -> Project Structure -> Modules -> spark-examples_2.11 -> Dependencies 添加依赖 jars -> {spark dir}/spark/assembly/target/scala-2.11/jars/</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/8ef98eb1002f405227e1515f4bfd954a.jpg"></p>    <p>有两点需要注意:</p>    <ul>     <li> <p>jars/*.jar: 这些依赖jars是在第一步编译打包Spark项目的时候产生的,如果这个目录是空的,或者修改了源代码想更新这些jars,可以用同样的命令再次编译Spark:</p> <pre>  $ build/mvn -T 4 -DskipTests clean package</pre> </li>     <li> <p>从上图中右侧的Scope一栏可以看到,基本上所有依赖jars都是Provided,也就是说默认都是提供的,因为默认都是用 spark-submit 方式运行Spark App的。</p> </li>    </ul>    <p>4. 成功运行实例代码</p>    <p>终于再次运行 LogQuery 的时候,可以看到输出啦: <img src="https://simg.open-open.com/show/835476ba986c96467c08b9c550d2e486.png"></p>    <h2>单步调试源代码</h2>    <p>千辛万苦地终于让实例代码在IDE里跑起来了,是不是很有成就感。其实做了那么多的铺垫工作,在IDE里面运行代码的最大福利是可以 <strong>单步调试</strong> ! 很简单,选择断点,然后 Run -> Debug ,可以看到中间变量值等等,其他的自行探索吧: <img src="https://simg.open-open.com/show/8c707b31340469b483f723b81dd48022.png"></p>    <p> </p>    <p>来自:https://github.com/linbojin/spark-notes/blob/master/ide-setup.md</p>    <p> </p>