我正在寻找在Java代码中将我的Spark Streaming作业提交给YARN的方法,最后决定使用 org.apache.spark.deploy.yarn.Client 来提交。一切都很好,但现在我发现我无法设置Spark或Spark Streaming的配置,例如spark.dynamicAllocation.enabled
。
我尝试了各种方法,例如设置用于创建SparkConf
的{{1}},设置用于创建JavaSparkContext
和SparkConf
的{{1}},并使用ClientArguments
,但它们都不起作用。我打算动态设置配置,但即使我修改了 spark-defaults.conf ,也没有任何改变。
我还尝试过其他方式来提交工作,例如使用Client
和System.setProperty(xxx)
,但除了这个问题,它们还有更多问题,而不是看起来像推荐的方法。
有人能告诉我一个解决方法吗?
答案 0 :(得分:1)
您可以使用SparkLauncher从Java代码在Yarn群集上运行Spark作业。例如,我用它从我的java web应用程序运行我的spark作业,将spark job jar打包到一个web app jar中。
如果您使用spark版本1.5并降低它看起来像这样(请参阅 SparkLauncher package):
Process sparkLauncherProcess = new SparkLauncher()
.setSparkHome(SPARK_HOME)
.setJavaHome(JAVA_HOME)
.setAppResource(SPARK_JOB_JAR_PATH)
.setMainClass(SPARK_JOB_MAIN_CLASS)
.addAppArgs("arg1", "arg2")
.setMaster("yarn-cluster")
.setConf("spark.dynamicAllocation.enabled", "true")
.launch();
sparkLauncherProcess.waitFor();
如果您使用Spark版本1.6及更高版本,它将会是这样的(请参阅SparkLauncher package SparkAppHandle有一些额外的功能):
SparkAppHandle handle = new SparkLauncher()
.setSparkHome(SPARK_HOME)
.setJavaHome(JAVA_HOME)
.setAppResource(SPARK_JOB_JAR_PATH)
.setMainClass(SPARK_JOB_MAIN_CLASS)
.addAppArgs("arg1", "arg2")
.setMaster("yarn-cluster")
.setConf("spark.dynamicAllocation.enabled", "true")
.startApplication();
您需要的唯一依赖是:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-launcher_2.11</artifactId>
<version>1.5.0</version>
<scope>provided</scope>
</dependency>