Как отключить ведение журнала INFO в Spark?

148

Я установил Spark с помощью руководства AWS EC2, и я могу нормально запустить программу, используя bin/pysparkсценарий, чтобы добраться до подсказки искры, а также могу успешно выполнить Quick Start quide.

Однако, хоть убей, я не могу понять, как остановить подробное INFOведение журнала после каждой команды.

Я пробовал почти все возможные сценарии в приведенном ниже коде (закомментировал, установил значение OFF) в моем log4j.propertiesфайле в confпапке, из которой я запускаю приложение, а также на каждом узле, и ничего не делает. Я по-прежнему получаю INFOпечать операторов журнала после выполнения каждого оператора.

Я очень смущен тем, как это должно работать.

#Set everything to be logged to the console log4j.rootCategory=INFO, 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.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

Вот мой полный путь к классам, когда я использую SPARK_PRINT_LAUNCH_COMMAND:

Команда Spark: /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp: /root/spark-1.0.1-bin-hadoop2/conf: /root/spark-1.0.1 -bin-hadoop2 / conf: /root/spark-1.0.1-bin-hadoop2/lib/spark-assembly-1.0.1-hadoop2.2.0.jar: /root/spark-1.0.1-bin-hadoop2/lib /datanucleus-api-jdo-3.2.1.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2.jar:/root/spark-1.0.1-bin-hadoop2 /lib/datanucleus-rdbms-3.2.1.jar -XX: MaxPermSize = 128m -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark. ответ.

содержание spark-env.sh:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.

# Options read when launching programs locally with 
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# - SPARK_CLASSPATH=/root/spark-1.0.1-bin-hadoop2/conf/

# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos

# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: ‘default’)
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.

# Options for the daemons used in the standalone deploy mode:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
# - SPARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers

export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"
Горацио1701d
источник
1
В программе Spark после создания сеанса вы можете установить уровень журнала, как указано ниже для Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("ИНФОРМАЦИЯ");
iKing

Ответы:

161

Просто выполните эту команду в каталоге spark:

cp conf/log4j.properties.template conf/log4j.properties

Отредактируйте log4j.properties:

# Set everything to be logged to the console
log4j.rootCategory=INFO, 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

Заменить в первой строке:

log4j.rootCategory=INFO, console

от:

log4j.rootCategory=WARN, console

Сохраните и перезапустите оболочку. У меня это работает для Spark 1.1.0 и Spark 1.5.1 на OS X.

Poiuytrez
источник
1
Это помогло, важно понять, что log4j.properties не существует, пока вы его не создадите. В Ubuntu мне не нужно было перезапускать, чтобы эти изменения вступили в силу.
подрывной
У меня не получилось. Искра 1.5. RHEL 6. CDH 5.5. Пытался создать новый файл /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties и изменить, как описано выше. А также попытался отредактировать существующий файл /etc/spark/conf/log4j.properties. Не влияет ни на pyspark shell, ни на pyspark-shell.
Tagar
нам нужно сделать это для всех узлов в искровом кластере?
облако
54

Вдохновленный pyspark / tests.py, я сделал

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 )

Вызов этого сразу после создания SparkContext уменьшил количество строк stderr, регистрируемых для моего теста с 2647 до 163. Однако создание самого SparkContext регистрирует 163, вплоть до

15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0

и мне непонятно, как их настроить программно.

FDS
источник
2
если у вас есть идеи о том, как отрегулировать эти линии, поделитесь, пожалуйста,
Ирэн
Я думаю, что нет прямого решения для изменения уровня отладки по умолчанию в PySpark ... до запуска SparkContext. Поскольку sc._jvm создается только после создания SC. Вы все еще можете изменить это с помощью файла log4j.properies, хотя, как описано в других ответах. Spark должен создать, например, переменную spark.default.logging, которую можно передать в SparkConf в качестве опции для переопределения уровня корневого регистратора по умолчанию.
Tagar
38

В Spark 2.0 вы также можете динамически настроить его для своего приложения с помощью setLogLevel :

    from pyspark.sql import SparkSession
    spark = SparkSession.builder.\
        master('local').\
        appName('foo').\
        getOrCreate()
    spark.sparkContext.setLogLevel('WARN')

В консоли pysparkspark уже будет доступен сеанс по умолчанию .

mdh
источник
Вы просто подавили сообщения журнала. Но реальный код работает в фоновом режиме. Если вы видите использование ЦП. Spark использует много процессора даже в режиме ожидания.
hurelhuyag
Это было именно то решение для работы PySpark, где log4jнедоступен.
yeliabsalohcin
35

Отредактируйте файл 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)

После этого вы не увидите никаких журналов.

АхлД
источник
3
более поздний вариант работает для искровой оболочки (scala), но что делать в случае pyspark без изменения файла log4j?
hmi2015
Было бы предпочтительнее изменить файл свойств log4j на «warn», но в противном случае этот ответ wannik действительно работает для изменения уровня журнала на консоль для pyspark stackoverflow.com/a/34487962/127971
Майкл
32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
Ванник
источник
Я использовал это для pyspark. Отлично работает как однострочный хак. Я все еще получаю глупые сообщения о смерти YarnExecutor, которые не должны быть ошибкой, imho. И так далее ...
jatal
2
Это подавляет ведение журнала после его выполнения, но, к сожалению, до этого момента существует много журналов INFO.
DavidJ
30

Для PySpark вы также можете установить уровень журнала в своих скриптах с помощью sc.setLogLevel("FATAL"). Из документов :

Контролируйте наш logLevel. Это отменяет любые пользовательские настройки журнала. Допустимые уровни журнала включают: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN.

Гален Лонг
источник
Отличное решение, которое работает для версий Spark новее 1.4 (так, с середины 2015 года).
Jealie 08
Я пробовал это с Spark 1.6.2 и Scala, и похоже, что это не работает
Yeikel
@Yeikel Это решение для PySpark. Извините, что непонятно - сейчас я отредактирую ответ.
Гален Лонг
16

Вы можете использовать setLogLevel

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")
Unmesha SreeVeni
источник
14

Это может быть связано с тем, как Spark вычисляет свой путь к классам. Я подозреваю, что log4j.propertiesфайл Hadoop появляется перед Spark в пути к классам, что не позволяет вашим изменениям вступить в силу.

Если ты бежишь

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

тогда Spark напечатает полный путь к классам, использованный для запуска оболочки; в моем случае я вижу

Spark Command: /usr/lib/jvm/java/bin/java -cp :::/root/ephemeral-hdfs/conf:/root/spark/conf:/root/spark/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/root/spark/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark/lib/datanucleus-core-3.2.2.jar:/root/spark/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize=128m -Djava.library.path=:/root/ephemeral-hdfs/lib/native/ -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main

где /root/ephemeral-hdfs/confнаходится во главе пути к классам.

Я открыл проблему [SPARK-2913], чтобы исправить это в следующем выпуске (скоро у меня должен быть патч).

А пока вот пара обходных путей:

  • Добавить export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"в spark-env.sh.
  • Удалить (или переименовать) /root/ephemeral-hdfs/conf/log4j.properties.
Джош Розен
источник
Спасибо. Я попытался добавить это в свой файл spark-env.sh, а также попытался удалить файл log4j.properties, но все еще получал вывод INFO. Я добавил свой полный путь к классу в вопросе.
horatio1701d 08
Спасибо за дополнительную информацию. Не могли бы вы также опубликовать содержимое spark-env.sh (вы можете отредактировать личную информацию, например имена хостов)?
Джош Розен
Спасибо. разместил spark-env.sh. Извините, если я неправильно понимаю, как запустить базовую настройку. Я просто оставил все по умолчанию, пока это возможно, просто чтобы попробовать немного протестировать.
horatio1701d 08
9

Spark 1.6.2:

log4j = sc._jvm.org.apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

Spark 2.x:

spark.sparkContext.setLogLevel('WARN')

(искра - это SparkSession)

В качестве альтернативы старым методам,

Переименовать , conf/log4j.properties.templateчтобы conf/log4j.propertiesв Спарк Dir.

В log4j.propertiesизмените log4j.rootCategory=INFO, consoleнаlog4j.rootCategory=WARN, console

Доступны различные уровни журнала:

  • ВЫКЛ. (Наиболее конкретная, без регистрации)
  • FATAL (наиболее конкретный, мало данных)
  • ОШИБКА - регистрировать только в случае ошибок
  • ПРЕДУПРЕЖДЕНИЕ - регистрировать только в случае предупреждений или ошибок
  • ИНФОРМАЦИЯ (по умолчанию)
  • DEBUG - подробный журнал шагов (и все журналы, указанные выше)
  • TRACE (наименее конкретно, много данных)
  • ВСЕ (наименее конкретно, все данные)
Ани Менон
источник
9

Программный способ

spark.sparkContext.setLogLevel("WARN")

Доступные Варианты

ERROR
WARN 
INFO 
одинокая звезда
источник
5

Я использовал это с Amazon EC2 с 1 главным и 2 подчиненными устройствами и Spark 1.2.1.

# Step 1. Change config file on the master node
nano /root/ephemeral-hdfs/conf/log4j.properties

# Before
hadoop.root.logger=INFO,console
# After
hadoop.root.logger=WARN,console

# Step 2. Replicate this change to slaves
~/spark-ec2/copy-dir /root/ephemeral-hdfs/conf/
Алексей
источник
5

Просто добавьте параметр ниже в свою команду spark-submit

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

Это временно отменяет системное значение только для этого задания. Проверьте точное имя свойства (здесь log4jspark.root.logger) в файле log4j.properties.

Надеюсь, это поможет, ура!

Гаурав Адуркар
источник
Еще я нашел полезным то, что вы можете указать файл log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle
2

Этот фрагмент кода ниже для пользователей scala:

Опция 1 :

Ниже фрагмент вы можете добавить на уровне файла

import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)

Вариант 2:

Примечание: это будет применимо для всего приложения, использующего сеанс искры.

import org.apache.spark.sql.SparkSession

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

Вариант 3:

Примечание. Эта конфигурация должна быть добавлена ​​в ваш log4j.properties .. (может выглядеть как /etc/spark/conf/log4j.properties (там, где установлена ​​Spark) или на уровне папки вашего проекта log4j.properties), поскольку вы меняете уровень модуля. Это будет применимо ко всему приложению.

log4j.rootCategory=ERROR, console

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

Рам Гадиярам
источник
1

Я делаю это так:

в том месте, где я запускаю spark-submitсценарий, сделайте

$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties

измените INFOлюбой уровень ведения журнала, который вы хотите, а затем запустите свойspark-submit

user3827333
источник
cp /etc/spark/conf/log4j.properties.template .
deepelement
0

Если вы хотите продолжать использовать ведение журнала (средство ведения журнала для Python), вы можете попробовать разделить конфигурации для вашего приложения и для Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Сантифинленд
источник