https://zhuanlan.zhihu.com/p/259610703
本篇文章主要是用Spark为例来讲, 其他的Java程序也可用相同的方式来做远程debug, 原理其实是相同的
什么是远程debug
远程debug就是断点打在你的本地环境, 但是代码(比如说Spark的jar包)是跑在远端的(可以理解为是服务端)
为什么需要远程debug
相信很多人在开发中遇到过这样的问题, 就是明明代码在自己的环境上是好的, 为什么去了测试环境就有问题, 这个时候你可能会质疑测试, 是不是准备的数据有问题?还是不会使用, 导致用错了场景? 还是部署有问题?
在做数据项目的时候, 遇到bug可能会把相应的数据下载到本地开发环境, 然后进行debug, 但如果遇到了如下的问题, 该怎么办呢
- 数据量特别大, 本地无法下载
- 数据比较敏感, 安全原因不让下载
- 本地无法搭建环境, 比如, 需要启动cluster, 需要至少三台物理节点
这个时候远程debug就要上场了, 这样你就能在本地看到远端运行的样子了, 而不用只看输出日志去推断可能哪里出了错误.
如何远程debug
配置Intellij IDEA
其实非常简单, 用Intellij IDEA打开你的代码, 点击右上角的“Edit Configurations”,
然后点击左上角的"+“, 添加一个“Remote”, 这个选项就是用来做远程Debug用的, 并且填写上你的spark job的Remote Host, 端口默认给的是5005
Spark-submit
然后我们把上图中的远程debug的JVM参数添加到spark-submit指令中去
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
所以spark-submit指令如下
spark-submit --driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 --class YourClassName s3://your-bucket/your_spark_jar.jar
这里需要注意一下, 用suspend=y而不是suspend=n, 是因为我们需要让程序在运行的时候能够停住
运行上述spark-submit的指令, 如下
可以看到运行了spark-submit之后, 你的代码一直停在了那里, 这就是我们想要的效果, 之后进行下一步
本地debug断点连接到远端5005的debug端口
我们需要在本地的代码中的相应位置打好断点, 然后点击debug按钮, IDEA的console中会输出如下
过一会儿之前spark-submit的代码就会在EMR上运行起来, 然后命中你在本地打的断点, 如下
至此, 这就是远程Debug的全部操作, 非常便于上手