我正试图使用InProcessLauncher从Java Spring应用程序提交一个集群模式的spark 2应用程序。我以前使用的是SparkLauncher类,它很有效,但它为每个作业启动了一个长期存在的SparkSubmit java进程,这占用了太多的资源,同时有很多作业在运行。
我的代码集sparkLauncher.setMaster("yarn")
和sparkLauncher.setDeployMode("cluster")
在启动我的Spring应用程序之前,我将HADOOP_CONF_DIR
env变量设置为包含我的配置的目录(yarn-site.xml等(,它记录它正在获取这个变量:
INFO System Environment - HADOOP_CONF_DIR = /etc/hadoop/conf
然而,当涉及到提交时,我看到INFO o.apache.hadoop.yarn.client.RMProxy - Connecting to ResourceManager at /0.0.0.0:8032
,即它使用默认的0.0.0.0,而不是实际的ResourceManager IP,当然它失败了。它似乎没有获取Hadoop配置。
我可以直接使用spark-submit
从同一个shell提交作业,甚至可以直接调用java -cp /usr/hdp/current/spark2-client/conf/:/usr/hdp/current/spark2-client/jars/*:/etc/hadoop/conf/ org.apache.spark.deploy.SparkSubmit ...
。所以我不知道为什么我的Spring应用程序没有采用相同的配置。
通过将conf文件夹添加到类路径中,我设法让我的应用程序获取hadoop配置。这是spark-submit
在作为单独进程启动时为您所做的事情,但在使用InProcessLauncher时不会发生。
因为我的Spring Boot应用程序是使用-jar xxx.jar
启动的,所以我不能在命令行上使用-cp
(不能与-jar
组合使用(,而是必须将其添加到jar中的清单中。我通过在build.gradle
(使用Spring Boot gradle插件(中添加以下内容来做到这一点:
bootJar {
manifest {
attributes 'Class-Path': '/usr/hdp/current/spark2-client/conf/ /etc/hadoop/conf/'
}
}