web-dev-qa-db-fra.com

Comment désactiver l'enregistrement INFO dans Spark?

J'ai installé Spark à l'aide du guide AWS EC2 et je peux lancer le programme correctement à l'aide du script bin/pyspark pour accéder à l'invite spark et effectuer le démarrage rapide avec succès.

Cependant, je ne peux pas comprendre comment arrêter toute la journalisation verbeuse INFO après chaque commande.

J'ai essayé presque tous les scénarios possibles dans le code ci-dessous (mise en commentaire, réglage sur OFF) dans mon fichier log4j.properties dans le dossier conf dans lequel je lance l'application à partir de chaque nœud et où rien ne fonctionne. Les instructions INFO de journalisation sont toujours imprimées après l’exécution de chaque instruction.

Je suis très confus avec la façon dont cela est supposé fonctionner. 

#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

Voici mon chemin de classe complet lorsque j'utilise SPARK_PRINT_LAUNCH_COMMAND:

Commande 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.repl.Main

contenu de 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"
111
horatio1701d

Il suffit d’exécuter cette commande dans le répertoire spark:

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

Editez 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

Remplacez à la première ligne:

log4j.rootCategory=INFO, console

par:

log4j.rootCategory=WARN, console

Enregistrez et redémarrez votre shell. Cela fonctionne pour moi pour Spark 1.1.0 et Spark 1.5.1 sur OS X.

136
poiuytrez

Inspiré par le pyspark/tests.py je l'ai fait

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 )

L'appel juste après la création de SparkContext a réduit le nombre de lignes stderr enregistrées pour mon test de 2647 à 163. Cependant, la création des journaux SparkContext lui-même 163, jusqu'à

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

et ce n'est pas clair pour moi comment ajuster ceux par programme.

45
FDS

Editez votre fichier conf/log4j.properties et modifiez la ligne suivante:

   log4j.rootCategory=INFO, console

à

    log4j.rootCategory=ERROR, console

Une autre approche serait de:

Fireup spark-Shell et tapez ce qui suit:

import org.Apache.log4j.Logger
import org.Apache.log4j.Level

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

Vous ne verrez plus aucun journal après cela.

34
AkhlD
>>> log4j = sc._jvm.org.Apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
32
wannik

Vous pouvez également définir le niveau de journalisation dans vos scripts avec sc.setLogLevel("FATAL"). De la docs :

Contrôler notre logLevel. Cela remplace tous les paramètres de journal définis par l'utilisateur. Les niveaux de journalisation valides incluent: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN

23
Galen Long

Dans Spark 2.0, vous pouvez également le configurer de manière dynamique pour votre application à l'aide de setLogLevel :

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

Dans la console pyspark, une session spark par défaut sera déjà disponible.

19
mdh

Cela peut être dû à la façon dont Spark calcule son classpath. Mon intuition est que le fichier log4j.properties de Hadoop apparaisse avant celui de Spark sur le classpath, empêchant ainsi vos modifications de prendre effet.

Si vous courez 

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-Shell

alors Spark imprimera le chemin de classe complet utilisé pour lancer le shell; dans mon cas, je vois 

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 est à la tête du classpath.

J'ai ouvert un problème [SPARK-2913] pour résoudre ce problème dans la prochaine version (je devrais bientôt avoir un correctif).

En attendant, voici quelques solutions de contournement:

  • Ajoutez export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf" à spark-env.sh.
  • Supprimer (ou renommer) /root/ephemeral-hdfs/conf/log4j.properties.
13
Josh Rosen

Vous pouvez utiliser setLogLevel

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

spark.sparkContext.setLogLevel("WARN")
6
Unmesha SreeVeni

Spark 1.6.2:

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

Spark 2.x:

spark.sparkContext.setLogLevel('WARN')

(étincelle étant la SparkSession)

Alternativement les anciennes méthodes,

Renommez conf/log4j.properties.template en conf/log4j.properties dans Spark Dir.

Dans le log4j.properties, remplacez log4j.rootCategory=INFO, console par log4j.rootCategory=WARN, console

Différents niveaux de journalisation disponibles:

  • OFF (le plus spécifique, pas de journalisation)
  • FATAL (plus spécifique, peu de données)
  • ERREUR - Enregistrer uniquement en cas d'erreurs
  • WARN - Se connecter uniquement en cas d’avertissements ou d’erreurs 
  • INFO (par défaut)
  • DEBUG - Étapes de détail du journal (et tous les journaux indiqués ci-dessus)
  • TRACE (moins spécifique, beaucoup de données)
  • ALL (le moins spécifique, toutes les données)
6
Ani Menon

Je l'ai utilisé avec Amazon EC2 avec 1 maître et 2 esclaves et 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
oleksii

La façon dont je le fais est:

à l'emplacement où j'exécute le script spark-submit do

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

changez INFO en fonction du niveau de journalisation souhaité, puis lancez votre spark-submit

1
user3827333

Le code ci-dessous pour les utilisateurs de scala:

Option 1:

Au-dessous de l'extrait, vous pouvez ajouter au niveau du fichier

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

Option 2:

Remarque: qui sera applicable à toutes les applications utilisant la session d'allumage.

import org.Apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Option 3:

Remarque: Cette configuration doit être ajoutée à votre fichier log4j.properties .. (par exemple, /etc/spark/conf/log4j.properties (où se trouve l’installation spark) ou votre log4j.properties au niveau du dossier de projet) niveau du module. Ce sera applicable pour toute l'application.

log4j.rootCategory=ERROR, console

À mon humble avis, l'option 1 est judicieuse, car elle peut être désactivée au niveau du fichier.

1
Ram Ghadiyaram

Manière programmatique

spark.sparkContext.setLogLevel("WARN")

Options disponibles

ERROR
WARN 
INFO 
0
Achyuth

Ajoutez simplement param ci-dessous à votre commande spark-submit

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

Cela annule temporairement la valeur système uniquement pour ce travail. Vérifiez le nom exact de la propriété (log4jspark.root.logger ici) à partir du fichier log4j.properties.

J'espère que cela aide, à la vôtre!

0
Gaurav Adurkar

Si vous souhaitez continuer à utiliser la journalisation (fonction de journalisation pour Python), vous pouvez essayer de séparer les configurations pour votre application et pour Spark:

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