Как остановить отображение сообщений INFO на спарк-консоли?
Я хотел бы остановить различные сообщения, которые появляются на искровой оболочке.
Я попытался отредактировать файл log4j.properties
, чтобы остановить это сообщение.
Вот содержимое log4j.properties
# Define the root logger with appender file
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
Но сообщения все еще отображаются на консоли.
Вот несколько примеров сообщений
15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star
Как это остановить?
Ответы
Ответ 1
Спасибо @AkhlD и @Sachin Janani за предложение изменений в файле .conf
.
Следующий код решил мою проблему:
1) Добавлен import org.apache.log4j.{Level, Logger}
в разделе импорта
2) Добавлена следующая строка после создания объекта контекста искры, т.е. после val sc = new SparkContext(conf)
:
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Ответ 2
Измените файл conf/log4j.properties
и измените следующую строку:
log4j.rootCategory=INFO, console
к
log4j.rootCategory=ERROR, console
Другой подход заключался бы в следующем:
Запустите искровую оболочку и введите следующее:
import org.apache.log4j.Logger
import org.apache.log4j.Level
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
После этого вы не увидите никаких журналов.
Другие параметры для Уровня включают: all
, debug
, error
, fatal
, info
, off
, trace
, trace_int
, warn
Сведения о каждом из них можно найти в документации.
Ответ 3
Сразу после запуска spark-shell
типа;
sc.setLogLevel("ERROR")
В Spark 2.0:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
Ответ 4
Используйте следующую команду, чтобы изменить уровень журнала при отправке приложения с использованием spark-submit или spark-sql:
spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"
Примечание: замените <file path>
где log4j
файл конфигурации log4j
.
Log4j.properties:
log4j.rootLogger=ERROR, console
# set the log level for these components
log4j.logger.com.test=DEBUG
log4j.logger.org=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.org.spark-project=ERROR
log4j.logger.org.apache.hadoop=ERROR
log4j.logger.io.netty=ERROR
log4j.logger.org.apache.zookeeper=ERROR
# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# use a simple message format
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="console" class="org.apache.log4j.ConsoleAppender">
<param name="Target" value="System.out"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
</layout>
</appender>
<logger name="org.apache.spark">
<level value="error" />
</logger>
<logger name="org.spark-project">
<level value="error" />
</logger>
<logger name="org.apache.hadoop">
<level value="error" />
</logger>
<logger name="io.netty">
<level value="error" />
</logger>
<logger name="org.apache.zookeeper">
<level value="error" />
</logger>
<logger name="org">
<level value="error" />
</logger>
<root>
<priority value ="ERROR" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
Ответ 5
Вы устанавливаете запрет журналов, устанавливая его уровень на OFF следующим образом:
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
или отредактируйте файл журнала и установите для уровня журнала значение, просто изменив следующее свойство:
log4j.rootCategory=OFF, console
Ответ 6
Я просто добавляю эту строку ко всем моим сценариям pyspark сверху чуть ниже операторов import.
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
пример заголовка моих скриптов pyspark
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
Ответ 7
Ответы выше верны, но точно не помогли мне, так как мне потребовалась дополнительная информация.
Я только что установил Spark, поэтому файл log4j все еще имел суффикс ".template" и не читался. Я считаю, что запись в журнал по умолчанию выполняется с помощью журнала регистрации ошибок Spark.
Итак, если вы похожи на меня и обнаружите, что ответы выше не помогли, то, возможно, вам тоже нужно удалить суффикс ".template" из вашего файла conf4 log4j, а затем все это работает отлично!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
Ответ 8
Все методы собраны с примерами
вступление
На самом деле, есть много способов сделать это. Некоторые из них сложнее других, но вам решать, какой из них подходит вам больше всего. Я постараюсь продемонстрировать их все.
# 1 Программно в вашем приложении
Кажется, это проще всего, но вам нужно будет перекомпилировать приложение, чтобы изменить эти настройки. Лично мне это не нравится, но работает нормально.
Пример:
import org.apache.log4j.{Level, Logger}
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
Вы можете добиться гораздо большего, используя log4j
API.
Источник: [ Документы конфигурации Log4J, раздел конфигурации]
# 2 Передайте log4j.properties
во время spark-submit
Это очень сложно, но не невозможно. И мой любимый.
Log4J при запуске приложения всегда ищет и загружает файл log4j.properties
из classpath.
Однако при использовании spark-submit
путь к классу Spark Cluster имеет приоритет над путем к классу приложения! Вот почему размещение этого файла в вашем fat-jar не отменит настройки кластера!
Добавьте -Dlog4j.configuration=<location of configuration file>
в spark.driver.extraJavaOptions
(для драйвера) или
spark.executor.extraJavaOptions
(для исполнителей).
Обратите внимание, что при использовании файла должен быть явно указан протокол file:
и файл должен существовать локально на всех узлах.
Чтобы выполнить последнее условие, вы можете либо загрузить файл в место, доступное для узлов (например, hdfs
), либо получить к нему локальный доступ с помощью драйвера, если используется deploy-mode client
. Иначе:
загрузите пользовательский log4j.properties
с помощью spark-submit, добавив его в список файлов --files
которые будут загружены вместе с приложением.
Источник: Документация Spark, Отладка
шаги:
Пример log4j.properties
:
# Blacklist all to warn level
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
Выполнение spark-submit
для режима кластера:
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Обратите внимание, что вы должны использовать --driver-java-options
если используете режим client
. Spark Docs, среда выполнения
Выполнение spark-submit
для режима клиента:
spark-submit \
--master yarn \
--deploy-mode cluster \
--driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Заметки:
- Файлы, загруженные в
--files
spark-cluster
с --files
будут доступны в корневом --files
, поэтому нет необходимости добавлять какой-либо путь в file:log4j.properties
. - Файлы, перечисленные в
--files
должны быть указаны с абсолютным путем! -
file:
префикс в URI конфигурации является обязательным.
# 3 Редактировать кластер conf/log4j.properties
Это изменяет файл конфигурации глобальной регистрации.
обновите файл $SPARK_CONF_DIR/log4j.properties
и он будет автоматически загружен вместе с другими конфигурациями.
Источник: Документация Spark, Отладка
Чтобы найти свой SPARK_CONF_DIR
вы можете использовать spark-shell
:
[email protected]:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ '/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
Теперь просто отредактируйте /var/lib/spark/latest/conf/log4j.properties
(с примером из метода № 2), и все ваши приложения будут использовать эту конфигурацию.
# 4 Переопределить каталог конфигурации
Если вам нравится решение № 3, но вы хотите настроить его для каждого приложения, вы можете скопировать папку conf
, отредактировать ее содержимое и указать в качестве корневой конфигурации во время spark-submit
.
Чтобы указать другой каталог конфигурации, отличный от используемого по умолчанию "SPARK_HOME/conf"
, вы можете установить SPARK_CONF_DIR
. Spark будет использовать файлы конфигурации (spark-defaults.conf
, spark-env.sh
, log4j.properties
и т.д.) Из этого каталога.
Источник: Spark Docs, Конфигурация
шаги:
- Скопируйте папку
conf
кластера (подробнее, метод № 3) - Отредактируйте
log4j.properties
в этой папке (пример в методе № 2) -
Установите SPARK_CONF_DIR
в эту папку перед выполнением spark-submit
,
пример:
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
Заключение
Я не уверен, есть ли какой-либо другой метод, но я надеюсь, что это охватывает тему от А до Я. Если нет, не стесняйтесь пинговать меня в комментариях!
Приятного пути!
Ответ 9
TL;DR
Для контекста искры вы можете использовать:
sc.setLogLevel(<logLevel>)
где loglevel
может быть ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE или WARN.
Подробности -
Внутри, setLogLevel
вызывает org.apache.log4j.Level.toLevel(logLevel)
, который затем использует для установки с помощью org.apache.log4j.LogManager.getRootLogger().setLevel(level)
.
Вы можете напрямую установить уровни ведения журнала на OFF
, используя:
LogManager.getLogger("org").setLevel(Level.OFF)
Вы можете настроить регистрацию по умолчанию для оболочки Spark в conf/log4j.properties
. Используйте conf/log4j.properties.template
в качестве отправной точки.
Установка уровней регистрации в приложениях Spark
В автономных приложениях Spark или во время сеанса Spark Shell используйте следующее:
import org.apache.log4j.{Level, Logger}
Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
Отключение ведения журнала (в log4j):
Используйте conf/log4j.properties
, чтобы отключить ведение журнала полностью:
log4j.logger.org=OFF
Справка: Освоение искры Яцеком Ласковски.
Ответ 10
В Python/Spark мы можем сделать:
def quiet_logs( sc ):
logger = sc._jvm.org.apache.log4j
logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )
После определения Sparkcontaxt 'sc'
вызовите эту функцию: quiet_logs (sc)
Ответ 11
Интересной идеей является использование RollingAppender, как предлагается здесь: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/
так что вы не "огласите" пространство консоли, но все же сможете видеть результаты в $YOUR_LOG_PATH_HERE/${dm.logging.name}.log.
log4j.rootLogger=INFO, rolling
log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8
Другим методом, который решает эту проблему, является наблюдение за тем, какие у вас журналы (исходящие из разных модулей и зависимостей), а также для каждого из них - для каждой записи, а также для "тихих" журналов сторонних производителей многословны:
Например,
# Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
Ответ 12
Просто добавьте следующий параметр к вашей команде spark-shell ИЛИ spark-submit
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
Проверьте точное имя свойства (log4jspark.root.logger здесь) из файла log4j.properties. Надеюсь, это поможет, ура!
Ответ 13
Просто сделать в командной строке...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..другие параметры..
Ответ 14
- Откорректируйте conf/log4j.properties, как описано другими
log4j.rootCategory = ERROR, консоль
- Убедитесь, что во время выполнения вашего искрового задания вы передаете флаг -file с файлом пути log4j.properties.
- Если он по-прежнему не работает, у вас может быть банка с параметрами log4j.properties, которая вызывается перед новыми log4j.properties. Удалите это log4j.properties из jar (если необходимо)
Ответ 15
sparkContext.setLogLevel("OFF")
Ответ 16
В дополнение ко всем вышеупомянутым постам, вот что решило проблему для меня.
Spark использует slf4j для привязки к логгерам. Если log4j не первая найденная привязка, вы можете редактировать файлы log4j.properties так, как вам хочется, регистраторы даже не используются. Например, это может быть возможный вывод SLF4J:
SLF4J: путь к классу содержит несколько привязок SLF4J. SLF4J: Обнаружена привязка в [jar: file: /C: /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar!/Org/slf4j/impl/StaticLoggerBinder.class] SLF4J: найдена привязка в [jar: file: /C: /Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: См. http://www.slf4j.org/codes.html#multiple_bindings для объяснения. SLF4J: фактическое связывание имеет тип [org.slf4j.impl.SimpleLoggerFactory]
Так что здесь был использован SimpleLoggerFactory, который не заботится о настройках log4j.
Исключая пакет slf4j-simple из моего проекта через
<dependency>
...
<exclusions>
...
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
решена проблема, так как теперь используется привязка логгера log4j и все настройки в log4j.properties соблюдаются. К сведению, мой файл свойств log4j содержит (помимо обычной конфигурации)
log4j.rootLogger=WARN, stdout
...
log4j.category.org.apache.spark = WARN
log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL
log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false
log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF
Надеюсь это поможет!
Ответ 17
Этот работал для меня. Для того, чтобы в качестве stdout
отображались только сообщения об log4j.properties
файл log4j.properties
может выглядеть так:
# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
ПРИМЕЧАНИЕ. Для эффективности поместите файл log4j.properties
папку src/main/resources
. И если log4j.properties
не существует (имеется в виду, что spark
использует файл log4j-defaults.properties
), вы можете создать его, перейдя в SPARK_HOME/conf
а затем mv log4j.properties.template log4j.properties
и затем перейдите к вышеуказанным изменениям.,
Ответ 18
Если у вас нет возможности редактировать код Java, чтобы вставить .setLogLevel()
и вы не хотите развертывать еще больше внешних файлов, вы можете использовать метод грубой силы, чтобы решить эту проблему. Просто отфильтруйте строки INFO, используя grep.
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
Ответ 19
Если кто-то еще застрял на этом,
ничего из вышеперечисленного не помогло мне. Я должен был удалить
implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'
из моего build.gradle для журналов, чтобы исчезнуть. TL;DR: не импортируйте другие фреймворки журналирования, все будет в порядке, просто используя org.apache.log4j.Logger