在Java代码

时间:2016-07-27 07:35:30

标签: java hadoop apache-spark spark-streaming yarn

我正在寻找在Java代码中将我的Spark Streaming作业提交给YARN的方法,最后决定使用 org.apache.spark.deploy.yarn.Client 来提交。一切都很好,但现在我发现我无法设置Spark或Spark Streaming的配置,例如spark.dynamicAllocation.enabled

我尝试了各种方法,例如设置用于创建SparkConf的{​​{1}},设置用于创建JavaSparkContextSparkConf的{​​{1}},并使用ClientArguments,但它们都不起作用。我打算动态设置配置,但即使我修改了 spark-defaults.conf ,也没有任何改变。

我还尝试过其他方式来提交工作,例如使用ClientSystem.setProperty(xxx),但除了这个问题,它们还有更多问题,而不是看起来像推荐的方法。

有人能告诉我一个解决方法吗?

1 个答案:

答案 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>