开发人员在进行程序编码的过程中,不可避免的需要对代码进行调试,其目的是能精确定位程序的运行状况。本文对spark源码进行调试,此调试方式可以调试任何JVM相关的程序,如:普通的命令行程序、web程序等。
1、实验环境
IPhostnamemasterworker
192.168.56.101master是否
192.168.56.102node1否是
192.168.56.103node2否是
192.168.56.104node3否是
2、spark-submit命令启动spark应用程序,并打开调试监听bin/spark-submit --class sparksql.HiveOnSQL scalastudy.jar --driver-java-options -agentlib:jdwp=transport=dt_socket,address=9904,server=y,suspend=y
说明:
这里spark-submit命令不做具体介绍,需要注意的是--driver-java-options参数,此参数是增加jvm相关参数这里使用"-agentlib:jdwp=transport=dt_socket,address=9904,server=y,suspend=y",启动监听程序,此命令执行后,控制台打印如下:
此监听已启动,此时就可以通过本地代码进行调试
3、调试方式
服务器打开一个9904的端口进行监听。客户端通过jdb或IDE中configurations配置即可连接。
1)jdb方式:在命令行$JAVA_HOME/bin/jdb -attach 10.68.156.40:9904进行连接
2)eclipse方式:Run->debug configurations->XX应用程序->Connection Properties中配置host和port
3)IDEA方式:Run->Edit configurations->"+"->Remote配置host和port
下面着重介绍IDEA方式,其他方式都差不多,读者可以自行尝试
(1)在IDEA中打开spark源码
由于spark-submit命令将会启动SparkSubmit.scala中的main函数,因此我们找到spark源码中的SparkSubmit.scala文件,并在main函数中增加断点
(2)IDE中配置远程调试
(3)debug启动
上图显示的就是调试的页面,可以任意增加断点,并调试执行,在控制台打印
远程调试成功。
深入学习可查看IBM的以下链接,详细介绍了java的调试体系
查看现有系统stack,可以使用jdk提供的如下命令
jstack [pid] > javastack.log