spark-submit в режиме развертывания кластера получить идентификатор приложения на консоль - PullRequest
0 голосов
/ 03 июля 2018

Я застрял в одной проблеме, которую мне нужно быстро решить. Я прочитал много постов и учебных пособий о режиме развертывания искрового кластера, но не знаю, как этот подход застрял на несколько дней.

Мой вариант использования: - У меня есть много заданий spark, отправленных с помощью команды «spark2-submit», и мне нужно, чтобы идентификатор приложения печатался в консоли после их отправки. Задания запуска отправляются в режиме развертывания кластера. (В обычном режиме клиента он печатается)

Вопросы, которые необходимо учитывать при создании решения: - Я не должен менять код (так как это займет много времени, потому что запущено много приложений), я могу предоставить только свойства log4j или некоторую пользовательскую кодировку.

Мой подход: -

1) Я попытался изменить уровни log4j и различные параметры log4j, но запись в журнал все еще идет в централизованный каталог журналов.

часть из моего log4j.properties:-

log4j.logger.org.apache.spark.scheduler.cluster.YarnClusterSchedulerBackend=ALL,console
log4j.appender.org.apache.spark.scheduler.cluster.YarnClusterSchedulerBackend.Target=System.out

log4j.logger.org.apache.spark.deploy.SparkSubmit=ALL
log4j.appender.org.apache.spark.deploy.SparkSubmit=console

log4j.logger.org.apache.spark.deploy.SparkSubmit=TRACE,console
log4j.additivity.org.apache.spark.deploy.SparkSubmit=false

log4j.logger.org.apache.spark.deploy.yarn.Client=ALL
log4j.appender.org.apache.spark.deploy.yarn.Client=console


log4j.logger.org.apache.spark.SparkContext=WARN
log4j.logger.org.apache.spark.scheduler.DAGScheduler=INFO,console

log4j.logger.org.apache.hadoop.ipc.Client=ALL

2) Я также попытался добавить пользовательский прослушиватель и смог получить идентификатор приложения spark после завершения приложений, но не на консоли.

Кодовая логика: -

public void onApplicationEnd(SparkListenerApplicationEnd arg0) 
    {
         for (Thread t : Thread.getAllStackTraces().keySet()) 
         {
            if (t.getName().equals("main"))
            {
                System.out.println("The current state : "+t.getState());

                Configuration config = new Configuration();

                ApplicationId appId = ConverterUtils.toApplicationId(getjobUId);

                // some logic to write to communicate with the main thread to print the app id to console.
            }
         }
    }

3) Я включил spark.eventLog в значение true и указал каталог в HDFS для записи журналов событий из команды spark-submit.

Если бы кто-нибудь мог помочь мне найти подход к решению, это было бы очень полезно. Или, если я делаю что-то очень неправильное, мне могут помочь любые идеи.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

После нескольких дней, проведенных в одном месте, я наконец смог найти решение своей проблемы.

После прохождения кода Spark для режима развертывания кластера и некоторых блогов выяснилось немногое. Это может помочь кому-то, кто хочет достичь того же результата.

В режиме развертывания кластера задание отправляется через поток клиента с компьютера, с которого отправляет пользователь. На самом деле я передавал конфиги log4j драйверу и исполнителям, но упустил ту часть, которая отсутствовала в конфигах log 4j для «Клиента».

Итак, нам нужно использовать: -

SPARK_SUBMIT_OPTS = "- Dlog4j.debug = true -Dlog4j.configuration = <location> / log4j.properties" spark-submit <rest of the parameters>

0 голосов
/ 03 июля 2018

уточнить:

  1. client mode означает, что драйвер Spark работает на той же машине, на которой вы запускали spark, отправьте с
  2. cluster mode означает, что драйвер Spark где-то заканчивается в кластере

Вы упомянули, что оно регистрируется, когда вы запускаете приложение в режиме client , и вы можете увидеть его в консоли. Ваш вывод также регистрируется, когда вы работаете в режиме cluster , который вы просто не видите , потому что он работает на другой машине.

Некоторые идеи:

  • Объедините журналы с рабочих узлов в одно место, где вы можете проанализировать их, чтобы получить идентификатор приложения.
  • Записать идентификаторы приложений в некоторые общие папки, например HDFS или базу данных. Вы можете использовать приложение Log4j , если хотите сохранить log4j.
...