工欲善其事,必先利其器。
为了更好的学习Spark,深入阅读理解源码是不错的途径。为了更好的阅读源码,跟踪调试源码是最直观和方便的途径。
下面就讲解一下如何利用Itelliji IDEA的远程调试功能,跟踪调试源码。
1.Spark源码版本采用最新的1.4.1
http://spark.apache.org/downloads.html
首先下载源码并解压。
2.下载Itelliji IDEA,选择免费的社区版本 Community Edition
https://www.jetbrains.com/idea/download/
3.为Itelliji IDEA安装Scala必要插件
打开IDEA,选择File->Settings->Plugins,选择Scala插件下载并重启完成安装。
同样的,安装Maven插件。如果使用sbt请安装sbt插件。
4.导入源码
这里源码以Maven工程的形式导入。
导入前,建议先通过Maven的方式编译一次源码,这样就可以在本地的Maven仓库中下好依懒的各种包,减少导入的时间。
通过Maven编译可以参考以前的文章http://blog.csdn.net/happyanger6/article/details/45205877
同理,如果以sbt方式导入,可以先通过sbt编译一次源码。
4.1 选择File->New->Project from exsiting sources,选择源码根目录,选择OK。
4.2 选择以Maven方式导入,然后一直下一步即可。
4.3 等待工程导入完成
5.修改Spark启动脚本,支持调试
关于Java远程调试的原理,可以通过下面这篇文章了解:http://www.ibm.com/developerworks/cn/opensource/os-eclipse-javadebug/
5.1 修改bin目录下的spark-class文件
这个shell脚本是spark加载大部分类文件的入口。
修改最后部分,红色为新增或修改内容:
export JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8440"
CMD=()
while IFS= read -d '' -r ARG; do
CMD+=("$ARG")
done < <("$RUNNER" -cp "$LAUNCH_CLASSPATH" org.apache.spark.launcher.Main $JAVA_OPTS "$@")
if [ "${CMD[0]}" = "usage" ]; then
"${CMD[@]}"
else
exec "${CMD[@]}"
fi
5.2 提交一个作业运行。
可以直接用spark自带的例子,也可以运行自己写的程序。
这里,我运行了一个自已写的例子,源码如下:
root@Master:/usr/local/spark/local-spark/spark-1.4.1-bin-hadoop2.6/bin# ./spark-submit firstsparkapp1.jar 1.txt
Listening for transport dt_socket at address: 8440
可以看到程序,挂住,等待连接到8440端口调试。
5.3 添加断点并调试
在spark-submit中添加断点:
org.apache.spark.deploy.SparkSubmit.scala:
1.选择Run->Edit Configurations->Remote,选择"+"号,添加一个远程调试,可以为调试命名,并修改Spark机器的IP和调试端口。
2.选择运行调试,调试快捷键F9
这样,我们就可以设置断点,跟踪Spark的运行,了解运行原理了。
下一节,我们以这节为基础,用本节中提到的例子,详细讲解RDD的依懒。