在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
我开始通过调整火花配置(更改分配给执行程序的RAM大小,内核数等)来研究此问题,但是并没有真正改变。
然后我在此作业配置中删除了一行代码:
.setConf("spark.executor.extraJavaOptions", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005")
执行者立即开始工作。
重要的是要指出一个事实,我没有启动任何调试过程,所以我没有暂停任何Spark线程。
那么您能理解我为什么指示调试需要的行不允许Spark运行作业吗? (只要没有外部进程连接,AFAIK仅启用调试端口就不会对运行时进程产生影响)。
谢谢。