为什么SparkLauncher会立即返回并且不会产生任何工作?

Jan*_*yne 9 java apache-spark spark-launcher

SparkLauncher在Spark v1.6.0中使用.我的问题是,当我使用这个类启动我的Spark作业时,它立即返回并且没有提交作业.我的代码如下.

new SparkLauncher()
 .setAppName("test word count")
 .setAppResource("file://c:/temp/my.jar")
 .setMainClass("my.spark.app.Main")
 .setMaster("spark://master:7077")
 .startApplication(new SparkAppHandler.Listener() {
   @Override public void stateChanged(SparkAppHandle h) { }
   @Override public void infoChanged(SparkAppHandle h) { } 
  });
Run Code Online (Sandbox Code Playgroud)

当我调试代码时,我注意到,令我惊讶的是,所有这些clazz真正做的是调用脚本spark-submit.cmd使用ProcessBuilder.

[C:/tmp/spark-1.6.0-bin-hadoop2.6/bin/spark-submit.cmd, --master, spark://master:7077, --name, "test word count", --class, my.spark.appMain, C:/temp/my.jar]

但是,如果我ProcessBuilder直接在控制台上运行此命令(运行的命令),则会提交Spark作业.关于发生了什么的任何想法?

还有另一种方法SparkLauncher.launch()可用,但javadocs说要避免这种方法.

知道发生了什么事吗?

小智 5

如果它在控制台中工作但不能从您的程序中工作,您可能需要告诉SparkLauncher您的Spark主目录所在的位置:

.setSparkHome("C:/tmp/spark-1.6.0-bin-hadoop2.6")
Run Code Online (Sandbox Code Playgroud)

但可能还有其他问题.您可能希望使用以下方法捕获其他调试信息:

.addSparkArg("--verbose")
Run Code Online (Sandbox Code Playgroud)

Map<String, String> env = Maps.newHashMap();
env.put("SPARK_PRINT_LAUNCH_COMMAND", "1");
Run Code Online (Sandbox Code Playgroud)

将env对象传递给SparkLauncher构造函数:

new SparkLauncher(env)
Run Code Online (Sandbox Code Playgroud)