java 远程调试spark_教你远程Debug Spark

本篇文章主要是用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的全部操作, 非常便于上手

如何避坑请确保你在EMR上的security group允许相应的debug端口号暴露, 例如5005

因为远程debug连接一个host, 如果你的debug断点无法命中, 所以请确保你的cluster是否只有一个实例, 如果出现双主, 多实例的情况有可能导致断点无法命中

请确保你远端运行的代码是和你本地代码一致的, 否则可能会出现不可预知的行为, 因为远程debug是按照行号来映射的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值