我很新兴,我想逐步学习如何在本地调试spark应用程序?有谁可以详细说明这样做的步骤?
我可以从命令行在本地运行spark网站上的simpleApp,但我只需要逐步完成代码并查看它是如何工作的。很感谢任何形式的帮助。谢谢。
答案 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)
--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文件也没关系,它应该加载所需的日志记录级别的设置,并且信息会在屏幕上显示。