我正在使用 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 中的解决方案不是很有帮助/需要很多样板+没有工作。
最佳答案
我会推荐以下两个选项之一:
远程调试 & IntelliJ Idea 的“评估表达式”
这里的基本思想是,您可以像调试您的应用程序一样调试您的应用程序,如果它只是从您的 IDE 中调试的一段普通代码。 Run->Evaluate expression
函数允许您对代码进行原型(prototype)设计,并且您可以使用大多数调试器的常用变量显示、步进(越过)等功能。但是,由于您不是在 IDE 中运行应用程序,因此您需要:
对于 1,请转到
Run->Edit configurations
,点击+
右上角的按钮,选择远程,复制Command line arguments for running remote JVM
下的文本字段的内容(official help)。对于 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 齐柏林飞艇
如果您正在编写更多脚本风格的 Scala,您可能会发现在 Zeppelin Spark Scala 解释器中编写它很有帮助。虽然它更像是 Jupyter/IPython 笔记本/
ipython
壳比 ( i
) pdb
,这确实允许您检查运行时发生的情况。这也将允许您绘制数据等。我将从 these docs 开始.警告
我认为上面只允许调试在 Driver 节点上运行的代码,而不是在 Worker 节点上(运行你的实际 map、reduce 等函数)。例如,如果您在
myDataFrame.map{ ... }
内的匿名函数内设置断点,它可能不会被击中,因为这是在某个工作节点上执行的。但是,例如myDataFrame.head
以及评估表达式功能,我已经能够满足我的大部分调试需求。话虽如此,我还没有尝试将 Java 选项专门传递给执行程序,所以也许有可能(但可能很乏味)让它工作。
关于scala - 在 Spark 脚本中放入 Scala 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41647286/