加入Spark脚本中的Scala解释器



我使用的是Scala2.11.8和Spark2.1.0。我对Scala完全陌生。

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

import pdb; pdb.set_trace()

在那里,我将被放入Scala外壳中,我可以检查脚本中执行的那一行发生了什么?(我也只接受剧本的结尾…)

我目前正在这样启动我的脚本:

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

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

编辑:另一篇SO文章中的解决方案不是很有帮助/需要很多样板+都不起作用。

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

远程调试&IntelliJ Idea的"评估表达">

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

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

对于1,转到Run->Edit configurations,点击右上角的+按钮,选择remote,然后复制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

现在你可以点击debug按钮,设置断点等。

阿帕奇齐柏林飞船

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

洞穴

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

最新更新