如何调试 Dataproc 上的 Spark 作业?

How to debug a Spark job on Dataproc?

我在 Dataproc 集群上有一个 Spark 作业 运行。如何配置环境以使用我的 IDE?

在我的本地计算机上调试它

本教程假设如下:

  • 您知道如何通过 API 调用、云 shell 命令或 Web UI
  • 创建 GCP Dataproc 集群
  • 您知道如何提交 Spark 作业
  • 您有权启动作业、创建集群和使用 Compute Engine 实例

经过一些尝试,我发现了如何在本地计算机上调试集群上的 DataProc Spark 作业 运行。

您可能知道,您可以通过使用 Web UI、向 DataProc API 发送请求或使用 gcloud dataproc jobs submit spark 命令来提交 Spark 作业。无论哪种方式,您首先将以下键值对添加到 the properties field in the SparkJobspark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=REMOTE_PORT,其中 REMOTE_PORT 是驱动程序将侦听的工作端口。

您的集群很可能位于专用网络上,您需要创建到 REMOTE_PORT 的 SSH 隧道。如果不是这种情况,那么您很幸运,您只需要使用 public IP 和 IDE.

上指定的 REMOTE_PORT 连接到 worker

使用 IntelliJ 会是这样的:

,

其中 worker-ip 是正在监听的 worker(我这次使用 9094 作为端口)。尝试了几次后,我发现它总是 worker 号 0,但是你可以连接到它并检查是否有进程 运行 使用 netstat -tulnp | grep REMOTE_PORT

如果出于某种原因您的集群没有 public IP,您需要设置一个从本地计算机到 worker 的 SSH 隧道。在指定你的 ZONE 和 PROJECT 后,你创建一个通往 REMOTE_PORT:

的隧道
gcloud compute ssh CLUSTER_NAME-w-0  --project=$PROJECT --zone=$ZONE  --  -4 -N  -L LOCAL_PORT:CLUSTER_NAME-w-0:REMOTE_PORT

并且您在 IDE 上设置调试配置指向 host=localhost/127.0.0.1port=LOCAL_PORT