9

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) { } 
  });

当我调试代码时,令我惊讶的是,这 clazz 所做的只是调用一个spark-submit.cmd使用ProcessBuilder.

[C:/tmp/spark-1.6.0-bin-hadoop2.6/bin/spark-submit.cmd,--master,spark://master:7077,--name,“测试字数”,--类,my.spark.appMain,C:/temp/my.jar]

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

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

知道发生了什么吗?

4

3 回答 3

5

如果它在控制台中运行但不能在您的程序中运行,您可能需要通过以下方式告诉 SparkLauncher 您的 Spark 主页在哪里:

.setSparkHome("C:/tmp/spark-1.6.0-bin-hadoop2.6")

但可能还有其他事情出错。您可能希望使用以下方法捕获其他调试信息:

.addSparkArg("--verbose")

Map<String, String> env = Maps.newHashMap();
env.put("SPARK_PRINT_LAUNCH_COMMAND", "1");

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

new SparkLauncher(env)
于 2016-04-08T03:43:54.323 回答
3

您需要等待启动器连接到驱动程序并获取应用程序 ID 和状态。为此,您可以执行 while 循环或类似的操作。例如。

   while(!handle.getState().isFinal()) { 
   logger.info("Current state: "+ handle.getState()) 
   logger.info("App Id "+ handle.getAppId());
   Thread.sleep(1000L);
   // other stuffs you want to do 
   //
   }
于 2017-03-20T18:38:26.683 回答
3

你如何new SparkLauncher()在程序中放置语句?

如果主程序/单元测试在调用后立即完成.startApplication(),那么由它创建的子进程也会终止。

您可以使用创建的句柄检查作业的状态

SparkAppHandle handle = new SparkLauncher()
    .setAppName("test word count")
    .setAppResource("file://c:/temp/my.jar")
    .setMainClass("my.spark.app.Main")
    .setMaster("spark://master:7077")
    .startApplication();

handle.getState();  // immediately returns UNKNOWN

Thread.sleep(1000); // wait a little bit...

handle.getState();  // the state may have changed to CONNECTED or others

我认为是因为应用程序连接到master需要一定的时间,如果程序在连接建立之前就结束了,那么就没有提交作业。

于 2016-12-08T09:20:12.480 回答