Apache spark 如何在Spark单机版上调试Spark应用程序?

Apache spark 如何在Spark单机版上调试Spark应用程序?,apache-spark,Apache Spark,我正在尝试使用一个主节点和几个工作节点在集群上调试Spark应用程序。我已经成功地使用Spark standalone cluster manager设置了主节点和工作节点。我下载了带有二进制文件的spark文件夹,并使用以下命令设置工作节点和主节点。这些命令从spark目录执行 发射船长命令 ./sbin/start-master.sh 用于启动工作节点的命令 ./bin/spark-class org.apache.spark.deploy.worker.Worker master-URL

我正在尝试使用一个主节点和几个工作节点在集群上调试Spark应用程序。我已经成功地使用Spark standalone cluster manager设置了主节点和工作节点。我下载了带有二进制文件的spark文件夹,并使用以下命令设置工作节点和主节点。这些命令从spark目录执行

发射船长命令

./sbin/start-master.sh
用于启动工作节点的命令

./bin/spark-class org.apache.spark.deploy.worker.Worker master-URL
提交申请的命令

./sbin/spark-submit --class Application --master URL ~/app.jar
现在,我想在提交应用程序时了解通过worker节点上的Spark源代码进行控制的流程(我只想使用一个使用reduce()的示例)。我想我应该在Eclipse上设置Spark。ApacheSpark网站上的Eclipse设置似乎已被破坏。我希望您能提供一些关于设置Spark和Eclipse的指导,以便在worker节点上单步执行Spark源代码


谢谢

在纱线上运行spark应用程序时,有如下选项:

YARN_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5455 $YARN_OPTS"
您可以将其添加到
纱线环境sh
,远程调试将通过
端口5455
实现

如果您在独立模式下使用spark,我相信这会有所帮助:

export SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

如果只需要调试转换的逻辑,可以在本地模式下运行Spark应用程序。这可以在IDE中运行,并且您可以像其他任何应用程序一样进行调试:

val conf = new SparkConf().setMaster("local").setAppName("myApp")

你当然不是在散布这个设置的问题。分发问题就像将主机更改为指向集群一样简单。

区分调试驱动程序和调试其中一个执行器是很重要的。它们需要传递给
spark submit

要调试驱动程序,可以将以下内容添加到
spark submit
命令中。然后将远程调试器设置为连接到启动驱动程序的节点

--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
在本例中,指定了端口5005,但如果该端口上已运行某些内容,则可能需要自定义该端口

连接到执行器类似,请将以下选项添加到
spark submit
命令中

--num-executors 1 --executor-cores 1 --conf "spark.executor.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=n,address=wm1b0-8ab.yourcomputer.org:5005,suspend=n"
用本地计算机的地址替换该地址。(最好测试您是否可以从spark cluster访问它)

在这种情况下,以侦听模式启动调试器,然后启动spark程序并等待执行器连接到调试器。将执行器的数量设置为1非常重要,否则多个执行器都将尝试连接到调试器,可能会导致问题


这些示例适用于在
sparkMaster
设置为
Warn client
的情况下运行,尽管它们在mesos下运行时也可以工作。如果您正在使用
纱线集群
模式运行,您可能必须将驱动程序设置为附加到调试器,而不是将调试器附加到驱动程序,因为您不必事先知道驱动程序将在哪个节点上执行。

我按照相同的步骤设置了spark独立集群。我能够调试驱动程序、主JVM、工作JVM和执行JVM

主节点和工作节点在服务器类计算机上配置。这台机器有12个CPU核。Spark-2.2.0的源代码已从Spark Git Repo中克隆

步骤:

1] 启动主JVM的命令:

root@ubuntu:~/spark-2.2.0-bin-hadoop2.7/bin#
    ./spark-class  -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8787     org.apache.spark.deploy.master.Master
root@ubuntu:~/spark-2.2.0-bin-hadoop2.7/bin# ./spark-class -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8788 org.apache.spark.deploy.worker.Worker spark://10.71.220.34:7077
shell脚本spark类用于手动启动主程序。第一个参数是在调试模式下启动主机的JVM参数。JVM被挂起并等待IDE建立远程连接

以下是显示用于远程调试的IDE配置的屏幕截图:

2] 启动辅助JVM的命令:

root@ubuntu:~/spark-2.2.0-bin-hadoop2.7/bin#
    ./spark-class  -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8787     org.apache.spark.deploy.master.Master
root@ubuntu:~/spark-2.2.0-bin-hadoop2.7/bin# ./spark-class -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8788 org.apache.spark.deploy.worker.Worker spark://10.71.220.34:7077
与master相同,最后一个参数指定spark master的地址。辅助进程的调试端口是8788

作为启动的一部分,工作进程向主进程注册

屏幕截图

3] 一个带有main方法的基本java应用程序被编译并包装在一个uber/fat jar中。“学习火花”一文对此进行了解释。基本上,Uber jar包含所有可传递的依赖项

通过在以下目录下运行mvn包创建:

root@ubuntu:/home/customer/Documents/Texts/Spark/learning-spark-master# mvn package
上面在./target文件夹下生成一个jar

下面的屏幕截图是java应用程序,它将提交给Spark Cluster:

4] 将命令提交到独立群集的命令

root@ubuntu:/home/customer/Documents/Texts/Spark/learning-spark-master# /home/customer/spark-2.2.0-bin-hadoop2.7/bin/spark-submit --master spark://10.71.220.34:7077

--conf "spark.executor.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8790"

--conf "spark.executor.extraClassPath=/home/customer/Documents/Texts/Spark/
learning-spark-master/target/java-0.0.2.jar" 

--class com.oreilly.learningsparkexamples.java.BasicMapToDouble

--name "MapToDouble"

./target/java-0.0.2.jar

spark://10.71.220.34:7077 → Argument to the java program → 

com.oreilly.learningsparkexamples.java.BasicMapToDouble
·上面的命令来自运行应用程序的客户机节点,其中包含main方法。但是,转换是在远程执行器JVM上执行的。

·

  • –conf参数很重要。它们用于配置 执行器JVM的。 执行器JVM由工作JVM在运行时启动

    ·第一个conf参数指定执行器JVM应该 在调试中启动 模式并立即暂停。它到达8790端口

    ·第二个conf参数指定执行器类路径 应包含提交给的特定于应用程序的JAR 遗嘱执行人。在分布式设置中,这些jar需要移动到 执行器JVM机器

    ·客户端应用程序使用最后一个参数连接到 火花大师

要了解客户端应用程序如何连接到Spark群集, 我们需要调试客户端应用程序并逐步完成它。为此,我们需要将其配置为在调试模式下运行

要调试客户端,我们需要编辑脚本spark submit,如下所示:

spark提交的内容

exec "${SPARK_HOME}"/bin/spark-class -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8789 org.apache.spark.deploy.SparkSubmit "$@"
5] 客户机注册后,工作线程在运行时在另一个线程上启动执行器

下面的屏幕截图显示了ExecutorRunner.scala类

6] 我们现在