在 Java 代码内使用客户端将 Spark Streaming 作业提交到 YARN 时无法设置配置
Cannot set configuration when submitting Spark Streaming jobs to YARN with Client within Java code
我正在寻找在 Java 代码内将我的 Spark Streaming 作业提交到 YARN 的方法,最后决定使用 org.apache.spark.deploy.yarn.Client 提交。一切看起来都很好,但现在我发现我无法设置 Spark 或 Spark Streaming 的配置,例如 spark.dynamicAllocation.enabled
.
我尝试了各种方法,比如设置SparkConf
用于创建JavaSparkContext
,设置SparkConf
用于创建ClientArguments
和Client
,并使用 System.setProperty(xxx)
,但其中 none 有效。我打算动态设置配置,但即使我修改spark-defaults.conf,也没有任何改变。
我也试过其他提交工作的方式,比如SparkSubmit.main(xxx)
和Runtime.getRuntime.exec("spark-submit", "xxx")
,但是除了这个问题,他们还有更多的问题,似乎不是推荐的方法。
谁能告诉我解决方法?
您可以使用 SparkLauncher 到 运行 从 java 代码在 Yarn 集群上启动作业。例如,我用它来 运行 我的 java 网络应用程序中的 spark 作业,spark 作业 jar 被打包到一个 web 应用程序 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>
我正在寻找在 Java 代码内将我的 Spark Streaming 作业提交到 YARN 的方法,最后决定使用 org.apache.spark.deploy.yarn.Client 提交。一切看起来都很好,但现在我发现我无法设置 Spark 或 Spark Streaming 的配置,例如 spark.dynamicAllocation.enabled
.
我尝试了各种方法,比如设置SparkConf
用于创建JavaSparkContext
,设置SparkConf
用于创建ClientArguments
和Client
,并使用 System.setProperty(xxx)
,但其中 none 有效。我打算动态设置配置,但即使我修改spark-defaults.conf,也没有任何改变。
我也试过其他提交工作的方式,比如SparkSubmit.main(xxx)
和Runtime.getRuntime.exec("spark-submit", "xxx")
,但是除了这个问题,他们还有更多的问题,似乎不是推荐的方法。
谁能告诉我解决方法?
您可以使用 SparkLauncher 到 运行 从 java 代码在 Yarn 集群上启动作业。例如,我用它来 运行 我的 java 网络应用程序中的 spark 作业,spark 作业 jar 被打包到一个 web 应用程序 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>