【发布时间】:2017-06-07 06:07:20
【问题描述】:
我正在开发一个应用程序以从 java 应用程序执行 spark 批处理应用程序。
有一个主类启动线程来启动spark 应用程序。它使用zookeeper 在将启动spark 应用程序的机器中查找leader。 Main 方法如下所示:
public static void main(String[] args) throws IOException {
final int id = Integer.valueOf(args[0]);
final String zkURL = args[1];
final ExecutorService service = Executors.newSingleThreadExecutor();
final Future<?> status = service.submit(new ProcessNode(id, zkURL));
try {
status.get();
} catch (InterruptedException | ExecutionException e) {
LOG.fatal(e.getMessage(), e);
service.shutdown();
}
一旦leader被选中,下面的代码就会在它上面运行以启动spark应用程序。
protected Boolean executeCommand() {
try {
final Runtime rt = Runtime.getRuntime();
final Process proc = rt.exec("sh start-sparkapp.sh");
final int exitVal = proc.waitFor();
BufferedReader buf = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
while ((line=buf.readLine())!=null) {
System.out.println(line);
}
System.out.println(" commandToExecute exited with code: " + exitVal);
proc.destroy();
} catch (final Exception e) {
System.out.println("Exception occurred while Launching process : " + e.getMessage());
return Boolean.FALSE;
}
return Boolean.TRUE;
}
但这会启动一个长期运行的spark 工作。所以我相信,只有在spark 作业完成时才会执行下一部分代码。我的要求是在spark 应用程序启动后,控制转到代码的下一部分,我正在监视相同spark 应用程序的状态。即我启动spark 应用程序并从同一个java 应用程序监视spark 应用程序的状态。
假设我有一个方法 montior 来监控应用程序的状态
public String monitor(ApplicationId id)
有什么建议可以实现吗?
【问题讨论】:
-
标签“apache-spark”是否合理?
标签: java multithreading apache-spark executorservice