Подтвердить что ты не робот

Как протоколировать 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

или

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

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

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

4b9b3361

Ответ 1

[Отредактировано, чтобы избежать путаницы]

Похоже, вам нужно добавить аргументы 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" ...

Ответ 2

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

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

yarn logs -applicationId <application id>

Ответ 3

В качестве альтернативы вы можете использовать PropertyConfigurator для log4j для определения ваших собственных свойств журнала.

Исх.

 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

EDIT: Обновление ссылки на log4j docs. Spark использует log4j 2, а не v1.2

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

Ответ 4

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

log4j.rootCategory=INFO, console    
log4j.rootCategory=INFO,file

Ответ 5

Отправка задания следующим образом:

spark-submit     
    --class com.X.datahub.djobi.Djobi \
    --name "djobi-dev" \
    --master "local" \
    --num-executors 1 \
    --deploy-mode client \
    --driver-memory 1g \
    --driver-cores 2 \
    --executor-memory 6g \
    --executor-cores 4 \
    --driver-java-options "-Dlog4j.debug=true -Dlog4j.configuration=config/log4j.properties" \
    --conf "spark.memory.fraction=0.4" \
    --conf "spark.yarn.executor.memoryOverhead=1024" \
    --conf "spark.executor.extraJavaOptions=-XX:+UseCompressedOops " \
    --conf "spark.sql.parquet.compression.codec=snappy" \
    ./target/X-1.0.jar "[email protected]"

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

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

log4j: Trying to find [config/log4j.properties] using context classloader [email protected] 

log4j: Using URL [jar:file:/Volumes/Data/tom/www/X/datahub/djobi/./target/X-1.0.jar!/config/log4j.properties] for automatic log4j configuration. 

log4j: Reading configuration from URL jar:file:/Volumes/Data/tom/www/X/datahub/djobi/./target/X-1.0.jar!/config/log4j.properties 

log4j: Parsing for [root] with value=[WARN, console].

Таким образом, файл берется с учетной записью в порядке.

Но вы действительно должны полагаться на агрегированные журналы YARN или пользовательский интерфейс Spark history.