从java以编程方式执行spark submit
我试图通过以下方式执行:从java以编程方式执行spark submit,java,apache-spark,runtime.exec,Java,Apache Spark,Runtime.exec,我试图通过以下方式执行: Process process = Runtime.getRuntime().exec(spark_cmd); 没有运气。通过shell运行的命令启动成功的应用程序。通过exec运行它会启动一个进程,该进程在运行后不久就会死亡,并且什么也不做。 当我尝试 process.waitFor(); 它永远挂着等待。当我试图从这个过程中读到一些东西时,真正的魔法就开始了: InputStreamReader isr = new InputStreamReader(proc
Process process = Runtime.getRuntime().exec(spark_cmd);
没有运气。通过shell运行的命令启动成功的应用程序。通过exec运行它会启动一个进程,该进程在运行后不久就会死亡,并且什么也不做。
当我尝试
process.waitFor();
它永远挂着等待。当我试图从这个过程中读到一些东西时,真正的魔法就开始了:
InputStreamReader isr = new InputStreamReader(process.getErrorStream());
BufferedReader br = new BufferedReader(isr);
为此,我启动一个线程,在while循环中读取流:
class ReadingThread extends Thread {
BufferedReader reader;
Wontekk(BufferedReader reader) {
this.reader = reader;
}
@Override
public void run() {
String line;
try {
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应用程序启动、执行某些操作并挂起。当我中止我的应用程序时,spark应用程序将唤醒(??????),并完成剩余的工作。有人对发生的事情有合理的解释吗
谢谢在SparkLauncher的帮助下,您可以通过java代码将spark作业作为spark submit发送,这样您就可以浏览下面的链接并查看我们的链接
一种方法是@Sandeep Purohit告诉我们的火花发射器 我会提供带有nohup命令的shell脚本方法来提交这样的作业 这在mapreduce执行的情况下对我有效。。。和你一样 试着做一些背景工作 看一看 “
nohup spark submit 2>&1
”
一旦收到消息,就可以轮询该事件并调用此shell脚本。下面是执行此操作的代码段
/**
* This method is to spark submit
* <pre> You can call spark-submit or mapreduce job on the fly like this.. by calling shell script... </pre>
* @param commandToExecute String
*/
public static Boolean executeCommand(final String commandToExecute) {
try {
final Runtime rt = Runtime.getRuntime();
// LOG.info("process command -- " + commandToExecute);
final String[] arr = { "/bin/sh", "-c", commandToExecute};
final Process proc = rt.exec(arr);
// LOG.info("process started ");
final int exitVal = proc.waitFor();
LOG.trace(" commandToExecute exited with code: " + exitVal);
proc.destroy();
} catch (final Exception e) {
LOG.error("Exception occurred while Launching process : " + e.getMessage());
return Boolean.FALSE;
}
return Boolean.TRUE;
}
下面的命令将列出进程打开的文件
lsof-p
另外,请看一下我的答案。这对我们有帮助吗?:还有其他选择吗?
ps -aef | grep "your pid or process name"
lsof -p <your process id >