Выполнить искровую отправку программно из java

Я пытаюсь выполнить его через:

Process process = Runtime.getRuntime().exec(spark_cmd);

без везения. Команда, запущенная через оболочку, запускает мое приложение, которое завершается успешно. Запуск его через 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 просыпается (??????????) и завершает оставшуюся работу. У кого-нибудь есть разумное объяснение происходящему?

Спасибо


person Łukasz    schedule 08.03.2016    source источник
comment
пожалуйста, посмотрите на мой ответ. Что сработало для нас..   -  person Ram Ghadiyaram    schedule 12.09.2016
comment
было полезно?   -  person Ram Ghadiyaram    schedule 13.09.2016


Ответы (2)


Вы можете отправить задание искры как отправку искры с помощью java-кода с помощью SparkLauncher, чтобы вы могли перейти по ссылке ниже и проверить ее.

https://spark.apache.org/docs/1.4.0/api/java/org/apache/spark/launcher/SparkLauncher.html

person Sandeep Purohit    schedule 08.03.2016
comment
: а есть ли другие варианты ? - person Ram Ghadiyaram; 12.09.2016

Один из способов - пусковая установка Spark, как сказал @Sandeep Purohit.

Я бы предложил сценарий оболочки с командой nohup для отправки такой работы...

Это сработало для меня в случае выполнения mapreduce ... так же, как вы можете попробовать и для фоновых заданий spark.

Посмотрите https://en.wikipedia.org/wiki/Nohup "nohup spark-submit <parameters> 2>&1 < /dev/null &"

Когда вы получаете сообщения, вы можете опросить это событие и вызвать этот сценарий оболочки. Ниже приведен фрагмент кода для этого...

/**
     * 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;
    }

Кроме того, для отладки

ps -aef | grep "your pid or process name"

Ниже команда выведет список открытых файлов, открытых процессом.

lsof -p <your process id > 

Кроме того, обратите внимание на process.waitFor() никогда не возвращается

person Ram Ghadiyaram    schedule 12.09.2016