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

时间:2017-01-14 06:04:27

标签: scala debugging interpreter

我使用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

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

编辑:此other SO post中的解决方案不是很有帮助/需要大量的样板+没有工作。

1 个答案:

答案 0 :(得分:2)

我建议使用以下两个选项之一:

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

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

  1. 设置IDE以进行远程调试,
  2. 为应用程序提供正确的Java选项以进行远程调试。
  3. 对于1,转到Run->Edit configurations,点击右上角的+按钮,选择远程,然后在Command line arguments for running remote JVM下复制文本字段的内容({{3 }})。

    对于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而不是(ipdb,但这确实允许您检查运行时发生的事情。这也可以让您绘制数据等图。我从official help开始。

    买者

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