我建议以下两种选项之一:
远程调试和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选项给执行器,因此可能有可能(但可能很繁琐)使其工作。
pdb
能够与 Python 和 Spark 一起使用吗,特别是在spark-submit
中?Spark 的分布式特性让我感到怀疑。无论如何,我认为你在 Scala 和 spark-submit 的调试器方面都没有什么好运气。 - Paul