如何在本地调试spark应用程序?

时间:2015-05-22 18:37:28

标签: debugging apache-spark local

我很新兴,我想逐步学习如何在本地调试spark应用程序?有谁可以详细说明这样做的步骤?

我可以从命令行在本地运行spark网站上的simpleApp,但我只需要逐步完成代码并查看它是如何工作的。很感谢任何形式的帮助。谢谢。

8 个答案:

答案 0 :(得分:21)

正如David Griffin所说,使用spark-shell可能会非常有帮助。但是,我发现做实际的本地调试,设置断点,检查变量等是不可或缺的。以下是我使用IntelliJ的方法。

首先,确保您可以使用spark-submit在本地运行spark应用程序,例如类似的东西:

spark-submit --name MyApp --class MyMainClass --master local[2] myapplication.jar

然后,通过添加如下选项,告诉本地火花驱动程序暂停并等待调试器启动时的连接:

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

其中agentlib:jdwp是Java Debug Wire Protocol选项,后跟逗号分隔的子选项列表:

  • transport定义调试器和调试对象之间使用的连接协议 - 套接字或"共享内存" - 你几乎总是想要socket(dt_socket),除了我相信在Microsoft Windows上的某些情况
  • server这个过程在与调试器(或相反地,客户端)通信时是否应该是服务器 - 您总是需要一个服务器和一个客户端。在这种情况下,我们将成为服务器并等待来自调试器的连接
  • suspend是否在调试器成功连接之前暂停执行。我们打开它,以便驱动程序在调试器连接之前不会启动
  • address这里,这是要监听的端口(用于传入的调试器连接请求)。您可以将其设置为任何可用端口(您只需确保将调试器配置为连接到同一端口)

现在,您的spark-submit命令行应该类似于:

spark-submit --name MyApp --class MyMainClass --master local[2] --conf spark.driver.extraJavaOptions=agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

现在,如果您运行上述内容,您应该会看到类似

的内容
Listening for transport dt_socket at address: 5005

并且您的spark应用程序正在等待调试器附加。

接下来,打开包含Spark应用程序的IntelliJ项目,然后打开"运行 - >编辑配置......"然后点击" +"添加新的运行/调试配置,然后选择" Remote"。给它一个名字,例如" SparkLocal",并选择" Socket"对于运输,"附加"对于调试器模式,输入" localhost"对于主机和上面用于端口的端口,在本例中为" 5005"。点击"确定"保存。

在我的IntelliJ版本中,它为调试命令行提供了建议,用于调试过程,它使用" suspend = n" - 我们忽略了这一点并使用" suspend = y" (如上所述)因为我们希望应用程序等到我们连接到start。

现在你应该准备调试了。只需使用上面的命令启动spark,然后选择刚刚创建的IntelliJ运行配置,然后单击Debug。 IntelliJ应该连接到您的Spark应用程序,该应用程序现在应该开始运行。您可以设置断点,检查变量等。

答案 1 :(得分:10)

启动Spark shell。这直接来自Spark documentation

./bin/spark-shell --master local[2]

您还会看到Spark shell被称为REPL。这是迄今为止学习Spark的最佳方式。我将80%的时间花在Spark shell上,另外20%将代码翻译成我的应用程序。

答案 2 :(得分:7)

只需传递java选项即可打开调试端口。以下是解决您问题的好文章 - http://danosipov.com/?p=779 我像

一样使用它
$ SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 spark-shell

(是的,SPARK_JAVA_OPTS已被弃用,但效果很好)

答案 3 :(得分:3)

@Jason Evans的回答对我不起作用。但是

--conf spark.driver.extraJavaOptions=-Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n

工作

答案 4 :(得分:1)

@Jason Evan的答案只需要进行一次小的改动。在String" agentlib ...."

之前需要一个' - '
 --conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

您也可以使用选项" - driver-java-options"达到同样的目的

--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005

答案 5 :(得分:1)

首先选择一个spark版本,然后选择一个IDE,intellij会更好。检出此spark版本的源代码,并确保可以从IDE(更多here)成功构建它。有了干净的构建后,请搜索测试用例或测试套件。例如,“ SubquerySuite”是一个简单的对象,然后像普通应用程序一样对其进行调试。评论您需要帮助的任何具体步骤

答案 6 :(得分:0)

您可以在spark-env.sh中进行尝试:

SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8888

答案 7 :(得分:0)

以下是在控制台上获取所有内容的方法:

首先在这里查看要在控制台上显示spark(log4j)的信息级别:

https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-logging.html

然后提交您的命令,如下所示:

path/to/spark-submit
  --master local[a number of cores here from your CPU]
  --driver-java-options "-Dlog4j.configuration=file:/path/to/log4j-driver.properties 
  -Dvm.logging.level=ALL"

“全部”将为您提供所有可获得的信息。同样,如果spark找不到您的log4.properties文件也没关系,它应该加载所需的日志记录级别的设置,并且信息会在屏幕上显示。