我正在使用SparkLauncher从Java应用程序启动spark作业。

SparkAppHandle jobHandle;
try {
    jobHandle = new SparkLauncher()
            .setSparkHome("C:\\spark-2.0.0-bin-hadoop2.7")
            .setAppResource("hdfs://server/inputs/test.jar")
            .setMainClass("com.test.TestJob")
            .setMaster("spark://server:6066")
            .setVerbose(true)
            .setDeployMode("cluster")
            .addAppArgs("abc")
            .startApplication();

} catch (IOException e) {
    throw new RuntimeException(e);
}

while(!jobHandle.getState().isFinal());


我可以看到我的作业在SparkUI上运行,并且正在顺利完成,没有任何错误。

但是,由于jobHandle.getState()始终保持为UNKNOWN状态,因此我的Java应用程序永远不会终止。我在这里想念什么?
我的spark API版本是2.0.0。另一个可能相关的细节是我的启动器应用程序正在Windows上运行。

最佳答案

您需要阻塞主线程,并等待驱动程序的回调。我已经在previous answer.中解释了一个概念

您可以在try / catch块中执行Thread.sleep,或者将Spark侦听器与CountDownLatch一起使用。

while(!jobHandle.getState().isFinal()) {
   //await until job finishes
   Thread.sleep(1000L);
}

09-27 21:34