Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在本地调试Spark应用程序?_Apache Spark - Fatal编程技术网

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

Apache spark 如何在本地调试Spark应用程序?,apache-spark,Apache Spark,我想一步一步地学习Spark,想知道如何在本地调试Spark应用程序?任何人都可以详细说明执行此操作所需的步骤吗 我可以从命令行在spark网站上本地运行simpleApp,但我只需要逐步浏览代码,看看它是如何工作的。启动spark shell。这直接来自于: 您还将看到称为REPL的火花壳。这是迄今为止学习Spark的最好方法。我将80%的时间花在Spark shell上,另外20%的时间将代码翻译到我的应用程序中。只需传递java选项即可打开调试端口。这是一篇很好的文章,回答了你的问题- 我

我想一步一步地学习Spark,想知道如何在本地调试Spark应用程序?任何人都可以详细说明执行此操作所需的步骤吗


我可以从命令行在spark网站上本地运行simpleApp,但我只需要逐步浏览代码,看看它是如何工作的。

启动spark shell。这直接来自于:


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

只需传递java选项即可打开调试端口。这是一篇很好的文章,回答了你的问题- 我用得很好

$ SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 spark-shell

(是的,SPARK_JAVA_OPTS已被弃用,但它运行良好)

以下是我使用IntelliJ的方法

首先,确保您可以使用
spark submit
在本地运行spark应用程序,例如:

spark-submit --class MyMainClass myapplication.jar
spark-submit \
  --name MyApp \
  --class MyMainClass \
  --conf spark.driver.extraJavaOptions=agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
然后,通过添加如下选项,告诉本地spark驱动程序在调试器启动时暂停并等待来自调试器的连接:

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
其中
agentlib:jdwp
是Java调试线协议(jdwp)选项,后跟逗号分隔的子选项列表:

  • transport
    定义了调试器和被调试器之间使用的连接协议——套接字或“共享内存”——除了我相信在某些情况下在Microsoft Windows上,您几乎总是需要套接字(
    dt_socket
  • server
    当与调试器(或相反,客户端)对话时,该进程是否应该是服务器——您始终需要一台服务器和一台客户端。在本例中,我们将作为服务器,等待来自调试器的连接
  • suspend
    是否暂停执行,直到调试器成功连接。我们打开此选项,以便在调试器连接之前驱动程序不会启动
  • address
    此处,这是要侦听的端口(用于传入的调试器连接请求)。您可以将其设置为任何可用端口(只需确保调试器已配置为连接到此端口)
现在,您的
spark submit
命令行应该如下所示:

spark-submit --class MyMainClass myapplication.jar
spark-submit \
  --name MyApp \
  --class MyMainClass \
  --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项目,然后打开“运行->编辑配置…”,然后单击“+”添加新的运行/调试配置,并选择“远程”。给它一个名称,例如“SparkLocal”,并为传输选择“Socket”,为调试器模式选择“Attach”,为主机键入“localhost”,为端口键入上面使用的端口,在本例中为“5005”。单击“确定”保存

在我的IntelliJ版本中,它为调试过程使用的调试命令行提供了建议,并且它使用了“suspend=n”——我们忽略了这一点,使用了“suspend=y”(如上所述),因为我们希望应用程序等待连接启动

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

火花壳 使用
spark shell
只需导出
spark\u SUBMIT\u选项
,如下所示:

export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
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"

使用调试器(例如IntelliJ IDEA)连接到
localhost:5005
,并导入Spark源,您应该能够一步一步地完成代码。

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

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

工作

对于@Jason Evan的答案,只需要一个小改动。字符串“agentlib…”前需要一个“-”

您还可以使用选项“-driver java options”来实现相同的目的

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

您可以在
spark env.sh
中尝试此功能:

SPARK\u SUBMIT\u OPTS=-agentlib:jdwp=transport=dt\u socket,server=y,suspend=y,address=8888

首先选择spark的版本,然后选择IDE,intellij会更好。签出此spark版本的源代码,并确保可以从IDE成功构建它(更多)。一旦你有了一个干净的构建,搜索测试用例或测试套件。例如,“SubquerySuite”是一个简单的应用程序,然后像普通应用程序一样调试它。评论您需要帮助的任何具体步骤以下是如何在控制台上获取所有信息:

首先检查此处,查看您希望spark(log4j)在控制台上打印的信息级别:

然后按如下方式提交命令:

export SPARK_SUBMIT_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
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文件也没关系,它应该加载所需日志级别的设置,并且信息将打印在您的屏幕上。

我真的不知道“学会调试”是什么意思。您可以查看本教程如何在IntelliJ ide中本地设置spark。我的意思是“如何在spark网站上逐步完成SimpleApp应用程序。有SimpleApp.java文件和pom.xml(如spark网站上的代码所示)。我如何使用Intellij IDE逐行遍历SimpleApp.java中的代码,并查看每一行的实际功能?我希望能够做到这一点,而无需将作业发送到群集。我只想在本地逐步浏览笔记本电脑上的代码。您提供的链接提供了使用Intellij IDEA构建Spark应用程序的步骤。如何逐步执行通过逐行代码?非常感谢任何帮助。谢谢。我不知道scala,但至少在java中,您可以使用标准IDEA调试器(在本地模式下)。有一件事你必须记住,如果你有一个大的集合,你必须一步一步地遍历所有元素。如果应用程序是用Java编写的呢?Scala spark shell可以加载Java JAR,然后你可以从Scala运行你的应用程序和/或方法。如果你是