我正在致力于应用程序从java
应用程序执行spark
批量应用程序。从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”是否合理? – suj1th