Как протоколировать 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.
Что мне не хватает.
Ответы
Ответ 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.