在Spark脚本中如何进入Scala解释器?

8

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

请问有没有一种类似Python的简单方法可以添加单行断点:

import pdb; pdb.set_trace()

我希望能够进入到一个Scala shell中,检查脚本执行过程中发生的事情。即使只是检查脚本的最后一行,我也可以接受。

目前,我是这样启动我的脚本:

$SPARK_HOME/bin/spark-submit --class "MyClassName" --master local target/scala-2.11/my-class-name_2.11-1.0.jar

有没有一种方法可以做到这一点?这会极大地帮助调试。

编辑:在这个其他的SO帖子中提供的解决方案不太有用/需要大量的样板代码+并且无法正常工作。


pdb 能够与 Python Spark 一起使用吗,特别是在 spark-submit 中?Spark 的分布式特性让我感到怀疑。无论如何,我认为你在 Scala 和 spark-submit 的调试器方面都没有什么好运气。 - Paul
我没有使用Python的Spark。 - lollercoaster
1个回答

2
我建议以下两种选项之一:
远程调试和IntelliJ Idea的“评估表达式”
基本思路是,您像调试普通代码一样调试应用程序,并使用“运行-> 评估表达式”功能原型化代码,您可以使用大多数调试器的常规变量显示、步骤(跳过)等功能。但是,由于您不是从IDE内部运行应用程序,因此需要:
1.设置IDE进行远程调试,以及 2.为远程调试提供正确的Java选项。
对于1,转到“运行->编辑配置”,点击右上角的“+”按钮,选择远程,并复制“运行远程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

现在您可以点击“debug”按钮,设置断点等。

Apache Zeppelin

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

注意

我认为上述代码只允许在Driver节点上调试代码,而不是在Worker节点上运行实际的map、reduce等函数。例如,在myDataFrame.map{ ... }内部的匿名函数中设置断点可能不会被触发,因为它是在某个工作节点上执行的。但是,通过使用myDataFrame.head和评估表达式功能,我已经能够满足大部分调试需求。话虽如此,我没有尝试特别传递Java选项给执行器,因此可能有可能(但可能很繁琐)使其工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接