我正在使用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);
}