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

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

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

Я использовал почти все возможные сценарии в приведенном ниже коде (комментируя, устанавливая в OFF) в моем файле log4j.properties в папке conf, где я запускаю приложение, а также на каждом node и ничего не делает. Я все еще получаю журналирование 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:

Команда искры: /Library/Java/JavaVirtualMachines/jdk 1.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- сборочно-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 ядра-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.repl.Main

содержимое 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"

Ответ 1

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

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.

Ответ 2

Вдохновленный 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 )

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

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

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

Ответ 3

Измените файл 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)

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

Это может быть связано с тем, как Spark вычисляет свой путь к классам. Моя догадка в том, что файл Hadoop log4j.properties появляется впереди 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.

Ответ 8

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

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

spark.sparkContext.setLogLevel("WARN")

Ответ 9

Спарк 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 в Spark Dir.

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

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

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

Ответ 10

Я использовал это с 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/

Ответ 11

Как я это делаю:

в месте, где я запускаю spark-submit script do

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

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

Ответ 12

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

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

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

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

Ответ 13

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

Опция 1 :

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

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

Вариант 2:

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

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

ИМХО, вариант 1 - мудрый способ, поскольку его можно отключить на уровне файлов.

Ответ 14

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

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')

Ответ 15

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

spark.sparkContext.setLogLevel("WARN")

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

ERROR
WARN 
INFO