我使用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中的解决方案不是很有帮助/需要大量的样板+没有工作。
答案 0 :(得分:2)
我建议使用以下两个选项之一:
这里的基本思想是,如果它只是在IDE中调试的普通代码,就像调试应用程序一样。 Run->Evaluate expression
函数允许您对代码进行原型设计,并且您可以使用大多数调试器的常用变量显示,步骤(上)等功能。但是,由于您没有在IDE中运行应用程序,因此需要:
对于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
按钮,然后设置断点等。
如果您正在编写更多脚本式Scala,您可能会发现在Zeppelin Spark Scala解释器中编写它很有帮助。虽然它更像是Jupyter / IPython笔记本/ ipython
shell而不是(i
)pdb
,但这确实允许您检查运行时发生的事情。这也可以让您绘制数据等图。我从official help开始。
我认为上面只允许调试在Driver节点上运行的代码,而不是在Worker节点上运行(运行实际的map,reduce等功能)。例如,如果您在myDataFrame.map{ ... }
内的匿名函数内设置断点,它可能不会被命中,因为它在某个工作节点上执行。但是,例如, myDataFrame.head
和评估表达式功能我已经能够满足我的大部分调试需求。话虽如此,我并没有尝试将Java选项专门传递给执行程序,所以也许它可能(但可能是乏味的)让它工作。