Spark源码调试分析(一)-------------调试环境准备

时间:2021-04-28 03:34:35

工欲善其事,必先利其器。

为了更好的学习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。

Spark源码调试分析(一)-------------调试环境准备


Spark源码调试分析(一)-------------调试环境准备


4.2 选择以Maven方式导入,然后一直下一步即可。

Spark源码调试分析(一)-------------调试环境准备



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自带的例子,也可以运行自己写的程序。

这里,我运行了一个自已写的例子,源码如下:

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:

Spark源码调试分析(一)-------------调试环境准备


1.选择Run->Edit Configurations->Remote,选择"+"号,添加一个远程调试,可以为调试命名,并修改Spark机器的IP和调试端口。

Spark源码调试分析(一)-------------调试环境准备


Spark源码调试分析(一)-------------调试环境准备





2.选择运行调试,调试快捷键F9

Spark源码调试分析(一)-------------调试环境准备


Spark源码调试分析(一)-------------调试环境准备


这样,我们就可以设置断点,跟踪Spark的运行,了解运行原理了。

下一节,我们以这节为基础,用本节中提到的例子,详细讲解RDD的依懒。