以编程方式启动Spark应用程序时提供Maven依赖项

时间:2016-02-01 13:15:08

标签: apache-spark spark-streaming

我想以编程方式启动多个Spark流,这些流取决于外部jar文件。

我尝试的第一种方法是在我的Java程序中执行“SparkSubmit.main(argument)”语句,其中“argument”是一个String数组,由--master, - class等参数组成。这很好,但它只能启动一个Stream。

第一个方法代码段:

String command = buildCommand();

SparkSubmit.main(命令);

“命令”的值类似于 --master [master] --class [StreamingClass] --repositories [Maven Repository] ​​ - 包[很多Maven坐标] [Jar文件名] [必需的命令行参数]

接下来的方法是尝试使用ProcessBuilder来生成多个线程;每个线程启动一个单独的“SparkSubmit.main(命令)”。这没用。我可以在Unix上看到进程ID,但由于某种原因,Kafka上收到的数据没有得到处理。

第三种方法是尝试SparkLauncher。但是,我不知道如何使用SparkLauncher以Maven坐标和存储库的形式指定所有这些外部jar文件。不能使用SparkLauncher.EXECUTER_EXTRA_CLASSPATH,因为我不想指定classpath。可以使用SparkLauncher.EXECUTOR_EXTRA_JAVA_OPTIONS,但不确定应使用哪些键来指定存储库和包。 ( - 存储库和 - 包或其他东西)。

不想创建一个超过50M的超级jar。

非常感谢您的帮助。

提前多多感谢。

- 至尊

1 个答案:

答案 0 :(得分:0)

我通过使用spark-submit作为命令启动ProcessBuilder来解决此问题。这类似于SparkLauncher(基于Spark源代码)。

作为旁注,由于要求是使用自己的JSSC启动多个流,所以我最终也使用了线程。

最终实施是这样的

        new Thread() {
            @Override
            public void run() {
                System.out.println("------------ Starting thread ");
                try {
                    launchWithProcessBuilder(jobService); // Job service is collection of attributes such as sparkmaster, repositories, packages etc
                } catch (SparkStreamException e) {
                    e.printStackTrace();
                }
            }
        }.start();

private void launchWithProcessBuilder(SparkStreamJobService jobService) {
    String sparkSubmitCommand = jobService.getSparkHome() + "/bin/spark-submit";
    List <String> command = getSparkSubmitCommandAsList(sparkSubmitCommand, jobService);

    try {
        ProcessBuilder pb = new ProcessBuilder(command);
        Process p = pb.start();
    } catch (IOException | InterruptedException e) {
    }
}

感谢