之前在IntelliJ idea搞过tomcat的远程调试,其实spark程序的远程调试和tomcat的远程调试是一样的。我的场景是要对打包好运行在spark集群的jar包进行调试,虽然网上有调试master和worker,但我是yarn模式,我只需要调试我spark-submit提交的app。
1.spark-submit参数配置
1.1在spark-submit提交命令加上参数:
--driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888"
1.2参数说明:
-Xdebug 启用调试特性
-Xrunjdwp 启用JDWP实现,包含若干子选项:
transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
address=8888 JVM在8888端口上监听请求,这个设定为一个不冲突的端口即可。
server=y y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。调试spark一点要设置y,让程序等待idea连接,否则就直接执行过去了
1.3完整的spark-submit提交命令:
./spark-submit --class org.apache.spark.examples.SparkPi --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8888" ../examples/jars/spark-examples_2.11-2.3.0.jar 100
注 --master这些参数我都配置在spark-default.conf中了,这里不赘述。
执行命令后会出现下面的监听等待信息:
Listening for transport dt_socket at address: 8888
然后我们用idea来远程调试连接就可以了。
2 idea远程调试配置
idea远程调试spark配置就和远程调试tomcat一样了。
2.1打开Intellij IDEA,在顶部工具栏靠右的地方服务下拉框选择”Edit Configurations…”,进去之后点击+号,选择”Remote”,按照下图的只是填写红框内的内容,其中host为远程代码运行的机器的ip/hostname,port为上一步指定的debug_port,本例是8888,和spark-submit driver-java-options指定的端口对应。
除了红框中的其他默认就好。
另外远程调试有两种模式,或者说有两种方式可选:
attach模式, 运行debuggee,让其监听某个ip:port,然后等待debugger启动并连接这个端口,然后就可以在debugger上断点调试。
listen模式,让debugger监听某个ip:port, 然后启动debugee连接这个端口,接下来在debugger上断点调试。
3 进行远程调试
在运行spark-submit后,在代码中打断点,然后点击debug按钮
控制台打印如下信息,并且代码自动运行到断点处。
Connected to the target VM, address: 'master:8888', transport: 'socket'
到此,spark远程调试配置成功。
注:必须使用client模式而不是cluster模式,否则不会开启debug模式,程序会执行过去,而不会等待idea连接