scala - 在 Spark 脚本中放入 Scala 解释器?

标签 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 中的解决方案不是很有帮助/需要很多样板+没有工作。

最佳答案

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

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

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

  • 设置用于远程调试的 IDE 和
  • 为应用程序提供正确的 Java 选项以进行远程调试。

  • 对于 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/

    相关文章:

    javascript - 查看 html 节点上的所有打开事件 - Javascript

    c++ - _DEBUG 与 NDEBUG

    multithreading - 链式2 future -计算一个并返回另一个

    c++ - 两个不同类的通用函数

    c++ - 解释器的良好优化

    c - C/C++ 中的微 Controller 串行命令解释器;方法;

    linux - 从脚本内部确定解释器

    scala - TransactionalMap 与 SynchronizedMap

    scala - sbt中,如何让跨版本插件顺利失败?

    scala - 如何在没有相同项目根目录的情况下做一个 sbt-(local) 多项目?