我在Spark上开发应用程序时遇到了一个意想不到的问题。
我已经启动了一个主进程和一个工作进程(./sbin/start-master.sh和./sbin/start-slave.sh)的spark独立集群。
我在Java代码中从SparkLauncher启动我的应用程序,所以它看起来像这样:
new SparkLauncher()
.setSparkHome("...")
.setAppName("...")
.setMaster("spark://admin:7077")
.setConf("spark.executor.extraJavaOptions", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
.startApplication(new SparkAppStateHandler());
我注意到没有一项工作真正开始。我的日志里满是这样的信息:
WARN TaskSchedulerImpl:66 - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
我开始通过调优spark配置(更改分配给执行器的RAM大小、内核数量等)来探索这个问题,但没有真正改变。
然后我删除了这个作业配置中的一行代码:
.setConf("spark.executor.extraJavaOptions", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
执行人立即开始执行他们的工作。
需要指出的是,我没有启动任何调试进程,所以我没有挂起任何Spark线程。
所以你能理解我为什么指示需要调试的行不允许Spark运行作业吗?(只要没有外部进程连接,仅启用调试端口的AFAIK应该不会对运行时进程产生影响)。
先谢谢你了。
1条答案
按热度按时间fnvucqvd1#
这可能是因为你使用了“suspend=y”。它将导致JVM在main()的开始处暂停,直到调试器连接到它。