教你远程Debug Spark

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的全部操作, 非常便于上手

如何避坑

  1. 请确保你在EMR上的security group允许相应的debug端口号暴露, 例如5005
  2. 因为远程debug连接一个host, 如果你的debug断点无法命中, 所以请确保你的cluster是否只有一个实例, 如果出现双主, 多实例的情况有可能导致断点无法命中
  3. 请确保你远端运行的代码是和你本地代码一致的, 否则可能会出现不可预知的行为, 因为远程debug是按照行号来映射的
posted @ 2021-02-24 15:31  上台阶  阅读(580)  评论(0编辑  收藏  举报