Як вимкнути журнал INFO в Spark?


144

Я встановив Spark за допомогою посібника AWS EC2, і я можу запустити програму за допомогою bin/pysparkсценарію, щоб дістатися до іскрового підказка, а також можу успішно виконати Швидкий старт.

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

Я спробував майже кожен можливий сценарій у наведеному нижче коді (коментування, встановлення вимкнено) в моєму 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 Command: /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 = 128м -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --клас 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"

У програмі Spark після створення сеансу ви можете встановити рівень журналу, як зазначено нижче для Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing

Відповіді:


158

Просто виконайте цю команду в іскровому каталозі:

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.


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, ні для pyspark-shell.
Тагар

чи нам це потрібно зробити для всіх вузлів в іскровому кластері?
хмара

54

Натхненний pyspark / testing.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

і мені незрозуміло, як їх програмно налаштувати.


2
якщо у вас є ідеї, як скорегувати ці рядки, будь ласка, поділіться
Irene

Я думаю, що немає прямого рішення змінити рівень налагодження за замовчуванням у PySpark .. до запуску SparkContext. Тому що sc._jvm створюється лише після створення SC. Ви все ще можете змінити це через файл log4j.properies, як це було обговорено в інших відповідях. Spark має створити, наприклад, змінну spark.default.logging, яку можна передати SparkConf як опцію для зміни рівня за умовчанням Root Logger.
Тагар

37

У Spark 2.0 ви також можете динамічно налаштувати її для програми за допомогою setLogLevel :

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

У консолі pysparkspark вже буде доступний сеанс за замовчуванням .


Ви просто придушили повідомлення журналу. Але фактичний код працює у фоновому режимі. Якщо ви бачите використання процесора. Іскри, використовуючи багато процесора навіть у режимі очікування.
hurelhuyag

Саме це було рішенням для роботи PySpark, де log4jнедоступний.
yeliabsalohcin

35

Відредагуйте файл conf / log4j.properties та змініть наступний рядок:

   log4j.rootCategory=INFO, console

до

    log4j.rootCategory=ERROR, console

Іншим підходом було б:

Іскрову оболонку Fireup і введіть наступне:

import org.apache.log4j.Logger
import org.apache.log4j.Level

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

Після цього ви не побачите жодного журналу.


3
пізніший варіант працює для spark-shell (scala), але що робити у випадку pyspark, не змінюючи файл log4j?
hmi2015

Зміна файлу властивостей log4j в «попередити» було б краще, але в іншому випадку ця відповідь на wannik робить роботу для зміни рівня протоколювання на консоль для pyspark stackoverflow.com/a/34487962/127971
майкл

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

Я використовував це для pyspark. Відмінно працює як хакер з одним лайнером. Я все ще отримую дурні повідомлення про померлі YarnExecutor, що не повинно бути помилкою, imho. І так йде ...
Джатал

2
Це пригнічує ведення журналу після його виконання, але, на жаль, існує багато журналів INFO до цього моменту.
DavidJ

28

Для PySpark ви також можете встановити рівень журналу у своїх сценаріях за допомогою sc.setLogLevel("FATAL"). З документів :

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


Прекрасне рішення, яке працює для версій Spark, новіших ніж 1.4 (так, з середини 2015 року).
Жалі

Я спробував це з Spark 1.6.2 та Scala, і це, здається, не працює
Yeikel

@Yeikel Це рішення призначено для PySpark. Вибачте, що не було зрозуміло - відповідь я зараз відредагую.
Гален Лонг

15

Ви можете використовувати setLogLevel

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

spark.sparkContext.setLogLevel("WARN")

14

Це може бути пов'язано з тим, як Spark обчислює свій класний шлях. Моя думка - це Хадопlog4j.properties файл з'являється попереду Spark на classpath, що запобігає набуття чинності вашим змінам.

Якщо ти біжиш

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

Дякуємо за додаткову інформацію. Чи можете ви також розмістити вміст spark-env.sh (ви можете редагувати приватну інформацію, як-от імена хостів)?
Джош Росен

спасибі. розміщено spark-env.sh. Вибачте, якщо я неправильно розумію, як почати налаштування бази. Я просто покинув усе якнайбільше за замовчуванням, лише щоб спробувати тестування.
horatio1701d

9

Іскра 1.6.2:

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

Іскра 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 (найбільш конкретні, мало даних)
  • ПОМИЛКА - Увійдіть лише у випадку помилок
  • ПОПЕРЕДЖЕННЯ - Увійдіть лише у випадку попереджень або помилок
  • INFO (за замовчуванням)
  • DEBUG - кроки з деталями журналу (і всі журнали, зазначені вище)
  • TRACE (найменш конкретний, багато даних)
  • ВСІ (найменш конкретні, усі дані)


5

Я використовував це з Amazon EC2 з 1 майстром і 2 рабами і іскрою 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/

4

Просто додайте нижче парам до своєї команди подання іскри

--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 (там, де встановлена ​​іскра) або ваш проект папки проекту log4j.properties), оскільки ви змінюєтесь на рівень модуля. Це стосується всіх програм.

log4j.rootCategory=ERROR, console

IMHO, варіант 1 - це мудрий спосіб, оскільки його можна вимкнути на рівні файлів.


1

Я це роблю:

у місці, де я запускаю spark-submitсценарій

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

змінити INFOпотрібний рівень реєстрації, а потім запустити свійspark-submit


cp /etc/spark/conf/log4j.properties.template .
заглиблення

0

Я хочу, щоб ви продовжували використовувати журнал (Засіб реєстрації для Python), ви можете спробувати розділити конфігурації для вашої програми та для Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.