Как войти с помощью log4j в локальную файловую систему внутри приложения Spark, которое работает на YARN?

Я создаю приложение Apache Spark Streaming и не могу записать его в файл в локальной файловой системе при запуске в YARN. Как этого добиться?

Я установил log4.properties файл так, чтобы он мог успешно записывать в файл журнала в /tmp каталоге локальной файловой системы (частично показано ниже):

log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=/tmp/application.log
log4j.appender.file.append=false
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Когда я запускаю свое приложение Spark локально, используя следующую команду:

spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar

Он работает нормально, и я вижу, что сообщения журнала записываются в /tmp/application.log в моей локальной файловой системе.

Но когда я запускаю то же приложение через YARN, например

spark-submit --class myModule.myClass --master yarn-client  --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

or

spark-submit --class myModule.myClass --master yarn-cluster  --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

Я не вижу никаких /tmp/application.log в локальной файловой системе машины, на которой работает YARN.

Что мне не хватает.


person Emre Sevinç    schedule 11.02.2015    source источник
comment
Я просто вставил ваш раздел log4j.properties и запустил его локально, как и ваш, но он не создает никакого файла журнала для моего / tmp. я что-то упускаю?   -  person user1870400    schedule 12.09.2017
comment
Я нашел этот пост полезным - stackoverflow.com/questions/27781187/   -  person Rahul Sharma    schedule 23.02.2018


Ответы (5)


Похоже, вам нужно будет добавить аргументы JVM, используемые при запуске ваших задач / заданий.

Попробуйте отредактировать conf/spark-defaults.conf как описано здесь

spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties

spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties

Или попробуйте отредактировать conf/spark-env.sh как описано здесь, чтобы добавить тот же аргумент JVM, хотя записи в conf / spark-defaults.conf должны работать.

Если вы все еще не получаете никакой радости, вы можете явно передать местоположение вашего файла log4j.properties в командной строке вместе с вашим spark-submit, как это, если файл содержится в вашем JAR-файле и в корневом каталоге вашего пути к классам.

spark-submit --class sparky.MyApp --master spark://my.host.com:7077 --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" myapp.jar

Если файла нет в вашем пути к классам, используйте префикс file: и полный путь, как это

spark-submit ... --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j-executor.properties" ...
person Brad    schedule 11.02.2015
comment
Я немного запутался. Мой файл log4j.properties упакован в файл JAR. Мое приложение - это проект Maven, и я создаю один большой автономный файл JAR, в котором также есть файл log4j.properties. Это отлично работает, когда я запускаю Spark локально. Это (размещение log4j.properties в JAR) невозможно, когда я запускаю Spark в кластере YARN? - person Emre Sevinç; 11.02.2015
comment
Да, это должно быть возможно. Я пытаюсь упростить проблему, урезав используемую вами конфигурацию. Я не специалист по Spark. У меня есть автономный кластер, ведущий журнал на хосте Windows. - person Brad; 11.02.2015
comment
@Emre Я поигрался с различными настройками, упомянутыми в моем ответе, что заставило меня переписать его. Я добился того, чтобы ведение журнала работало, отредактировав spark-defaults.conf, а затем также заставил его работать с помощью spark-submit --conf. Либо один, либо другой должны работать (вам не нужны оба) - person Brad; 11.02.2015
comment
Привет! Можно ли это использовать для файла журнала, который не находится в пути к классам и не содержится в банке? Я скопировал log.properties в исполнитель и использовал аргумент командной строки, но он сообщает, что его нельзя найти, спасибо - person null; 03.10.2016
comment
да. Приведенные выше примеры с использованием =file:/apps/ ссылаются на абсолютный путь на диске, а не на файл в пути к классу или в JAR. - person Brad; 04.10.2016
comment
@ EmreSevinç, это не сработает. Приложение Spark worker - это не ваша банка, а приложение, которое запускает код Spark, отправляемый только из драйвера, см. Мой ответ, вы должны использовать статический файл (в HDFS или любой другой общей файловой системе или через директиву --files Spark) . - person Thomas Decaux; 10.10.2018
comment
Много лет спустя ... Я согласен с тем, что лучшим решением будет использование spark-submit --files "./log4j.properties" ..., где log4j.properties находится в каталоге, из которого вы выполняете эту команду. Файл свойств будет отправлен Драйверу и Исполнителям. - person Brad; 10.10.2018

Вышеупомянутые варианты указания log4j.properties с помощью spark.executor.extraJavaOptions, spark.driver.extraJavaOptions будут регистрировать его только локально, а также log4.properties должен присутствовать локально на каждом узле.

Как указано в https://spark.apache.org/docs/1.2.1/running-on-yarn.html, вы также можете загрузить log4j.properties вместе со своим приложением, используя параметр --files. Это приведет к совокупному ведению журнала пряжи в HDFS, и вы можете получить доступ к журналу с помощью команды

yarn logs -applicationId <application id>
person Chandra    schedule 28.08.2015
comment
у вас есть пример файла log4j.properties для входа в HDFS? - person Irene; 22.10.2015
comment
@Irene Это единственное отличие от обычного файла log4.properties. log4j.appender.file_appender.File = $ {spark.yarn.app.container.log.dir} /spark.log. - person Chandra; 28.10.2015

1) Для отладки того, как Spark on YARN интерпретирует ваши настройки log4j, используйте флаг log4j.debug.

2) Spark создаст 2 типа контейнеров YARN, драйвер и рабочий. Итак, вы хотите поделиться файлом, из которого вы отправляете приложение, со всеми контейнерами (вы не можете использовать файл внутри JAR, поскольку это не тот JAR, который действительно запускается), поэтому вы должны использовать директиву отправки --files Spark (это будет разделять файл со всеми рабочими).

Нравится:

spark-submit     
    --class com.X.datahub.djobi.Djobi \
    --files "./log4j.properties" \
    --driver-java-options "-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties " \
    ./target/X-1.0.jar "$@"

Где log4j.properties - это файл проекта в папке src/main/resources/config.

Я вижу в консоли:

log4j: Trying to find [config/log4j.properties] using context 
classloader org.apache.spark.util.MutableURLClassLoader@5bb21b69.
log4j: Using URL [jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties

Таким образом, файл учитывается, вы также можете проверить его в веб-интерфейсе Spark.

person Thomas Decaux    schedule 26.10.2017

Кроме того, вы можете использовать PropertyConfigurator в log4j, чтобы определить свои настраиваемые свойства журнала.

Ex.

 import com.foo.Bar;

 import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;

 public class MySparkApp {

   static Logger logger = Logger.getLogger(MySparkApp.class.getName());

   public static void main(String[] args) {

     // Location to property file
     PropertyConfigurator.configure(args[0]);

     logger.info("Entering application.");

     logger.info("Exiting application.");
   }
 }

Ваш файл свойств должен иметь следующие реквизиты,

log4j.appender.file=org.apache.log4j.FileAppender

log4j.appender.file.File=/tmp/application.log

log4j.appender.file.append=false

log4j.appender.file.layout=org.apache.log4j.PatternLayout

log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

РЕДАКТИРОВАТЬ: Обновление ссылки на документы log4j. Spark использует log4j 2, а не v1.2

Ссылка: http://logging.apache.org/log4j/2.x/

person Ashwin Giridharan    schedule 14.07.2015
comment
Я не знаю, подойдет ли это как для исполнителя, так и для драйвера. В приведенном выше коде он, вероятно, будет настроен только для драйвера. - person panther; 26.04.2017

В вашем файле log4j.properties вы также должны изменить log4j.rootCategory с INFO,console на INFO,file.

log4j.rootCategory=INFO, console    
log4j.rootCategory=INFO,file
person Bing    schedule 06.10.2016
comment
Привет, @Vojtech, это будет зависеть от вашей версии регистратора ... взгляните на logging.apache.org/log4j/1.2/manual.html - person Mário de Sá Vera; 02.08.2017