Сохранить выходные данные Spark Launcher в файл

Я отправляю свои задания в искровой кластер (с YARN) программно с помощью Java-приложения и Spark Launcher (запуская задание с помощью startApplication(), а не запуска()). Мне нравится иметь весь вывод журнала, который создается на stdout и stderr программой запуска при выполнении приложения Java, в файле, к которому я могу получить доступ с помощью java-приложения. Я не хочу менять глобальную конфигурацию spark-log-config, мне нужно динамическое решение, которым я могу управлять в зависимости от изменения переменных из java-приложения при каждом отдельном выполнении.

Следуя документации это должно быть возможно с помощью параметра CHILD_PROCESS_LOGGER_NAME. Поэтому я определил java.util.logging.logger, например здесь, и добавил этот код в мою программу запуска заданий:

SparkLauncher.setConfig(SparkLauncher.CHILD_PROCESS_LOGGER_NAME, "MyLog");

Но это не работает, лог-файл пустой. Я также пробовал другие методы, такие как setConf(...) или addSparkArg(...), но безуспешно. Что я сделал не так? Или мне лучше использовать log4j, сделать пользовательскую конфигурацию и отдать ее каким-либо образом в лаунчер? Если да, то как это сделать в моем java-приложении?


person MUmla    schedule 20.08.2017    source источник


Ответы (2)


Ниже приведен фрагмент кода, который я использовал для печати журналов sparkLauncher с помощью slf4j-log4j:

private static final Logger LOGGER = LoggerFactory.getLogger(JobSubmitter.class);

SparkLauncher launcher = new SparkLauncher()............;//prepare launcher

launcher.redirectToLog(JobSubmitter.class.getName());
        SparkAppHandle handler = launcher.startApplication();
        while (handler.getState() == null || !handler.getState().isFinal()) {
            if (handler.getState() != null) {
                LOGGER.info("Job state is :{} " , handler.getState());
                if (handler.getAppId() != null) {
                    LOGGER.info("App id: {} :: state:{}" , handler.getAppId() , handler.getState());
                }
            }
//Pause job to reduce job check frequency
            Thread.sleep(jobStatusCheckInterval ==0?DEFAULT_JOB_STATUS_CHECK_INTERVAL:jobStatusCheckInterval);
        }

Добавьте комментарий, если у вас есть какие-либо вопросы.

person Rahul Sharma    schedule 21.08.2017
comment
Я также обнаружил метод redirectToLog(), когда гуглил, но он мне недоступен, и я уже запутался. Теперь я знаю, почему, я должен был упомянуть об этом: я использую Spark 1.6, где этот метод не был реализован! Тогда вероятность найти решение кажется очень низкой, я думаю :( Или есть еще какой-то способ? - person MUmla; 21.08.2017
comment
Взгляните на ответ TomaszGuzialek Здесь он использует поток для извлечения log из потока вывода/ошибки. - person Rahul Sharma; 22.08.2017

Я попытался с помощью redirectOutput(java.io.File outFile) и смог получить все журналы sparkLauncher в outFile.

person khushbu kanojia    schedule 07.03.2018