在Spark脚本中插入Scala解释器?

lol*_*ter 7 debugging interpreter scala

我正在使用Scala 2.11.8和Spark 2.1.0.我对Scala完全不熟悉.

是否有一种简单的方法来添加单行断点,类似于Python:

import pdb; pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

我将被放入Scala shell中,我可以检查脚本中执行行的内容是什么?(我也很满意脚本的结尾......)

我目前正在开始我的脚本:

$SPARK_HOME/bin/spark-submit --class "MyClassName" --master local target/scala-2.11/my-class-name_2.11-1.0.jar
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?将极大地帮助调试.

编辑:这个其他SO帖子的解决方案不是很有帮助/需要很多样板+不起作用.

m01*_*m01 2

我会推荐以下两个选项之一:

远程调试&IntelliJ Idea的“评估表达式”

这里的基本思想是,您可以像在 IDE 中调试一段普通代码一样调试您的应用程序。该Run->Evaluate expression函数允许您对代码进行原型设计,并且您可以使用调试器的大多数常用变量显示、单步(跳过)等功能。但是,由于您不是从 IDE 中运行应用程序,因此您需要:

  1. 设置 IDE 以进行远程调试,以及
  2. 为应用程序提供正确的 Java 选项以进行远程调试。

1、进入Run->Edit configurations,点击+右上角的按钮,选择远程,然后复制Command line arguments for running remote JVM官方帮助)下文本字段的内容。

对于 2,您可以使用SPARK_SUBMIT_OPTS环境变量来传递这些 JVM 选项,例如:

SPARK_SUBMIT_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" \
  $SPARK_HOME/bin/spark-submit --class Main --master "spark://127.0.0.1:7077" \
  ./path/to/foo-assembly-1.0.0.jar
Run Code Online (Sandbox Code Playgroud)

现在您可以点击debug按钮并设置断点等。

阿帕奇齐柏林飞艇

如果您正在编写更多脚本风格的 Scala,您可能会发现在 Zeppelin Spark Scala 解释器中编写它会很有帮助。虽然它更像 Jupyter/IPython 笔记本/ ipythonshell 而不是 ( i) pdb,但这确实允许您检查运行时发生的情况。这还允许您绘制数据等图表。我将从这些文档开始。

警告

我认为上面的内容只允许调试在 Driver 节点上运行的代码,而不是在 Worker 节点(运行实际的映射、reduce 等函数)上运行的代码。例如,如果您在 inside 的匿名函数内设置断点myDataFrame.map{ ... },它可能不会被命中,因为它是在某个工作节点上执行的。然而,通过egmyDataFrame.head和评估表达式功能,我已经能够满足我的大部分调试需求。话虽如此,我并没有尝试专门将 Java 选项传递给执行器,所以也许有可能(但可能很乏味)让它工作。