从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 >