我想以编程方式启动多个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。
非常感谢您的帮助。
提前多多感谢。
- 至尊
答案 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) {
}
}
感谢