idea spark 程序远程调试

spark | 2019-09-13 10:02:39

之前在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指定的端口对应。

QQ截图20190215094021.png

除了红框中的其他默认就好。


另外远程调试有两种模式,或者说有两种方式可选:


attach模式, 运行debuggee,让其监听某个ip:port,然后等待debugger启动并连接这个端口,然后就可以在debugger上断点调试。

listen模式,让debugger监听某个ip:port, 然后启动debugee连接这个端口,接下来在debugger上断点调试。



3 进行远程调试

在运行spark-submit后,在代码中打断点,然后点击debug按钮

2.png

控制台打印如下信息,并且代码自动运行到断点处。

Connected to the target VM, address: 'master:8888', transport: 'socket'


到此,spark远程调试配置成功。

注:必须使用client模式而不是cluster模式,否则不会开启debug模式,程序会执行过去,而不会等待idea连接






登录后即可回复 登录 | 注册
    
关注编程学问公众号