Apache spark 如何在Spark单机版上调试Spark应用程序?
我正在尝试使用一个主节点和几个工作节点在集群上调试Spark应用程序。我已经成功地使用Spark standalone cluster manager设置了主节点和工作节点。我下载了带有二进制文件的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
./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机器 ·客户端应用程序使用最后一个参数连接到 火花大师
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] 我们现在