Comment désactiver la journalisation INFO dans Spark?

144

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

Cependant, je ne peux pas pour la vie de moi comprendre comment arrêter toute la INFOjournalisation détaillée après chaque commande.

J'ai essayé presque tous les scénarios possibles dans le code ci-dessous (commenter, régler sur OFF) dans mon log4j.propertiesfichier dans le confdossier dans lequel je lance l'application ainsi que sur chaque nœud et rien ne fait rien. J'obtiens toujours l' INFOimpression des instructions de journalisation après l'exécution de chaque instruction.

Je suis très confus avec la façon dont cela est censé 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. principal

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"
horatio1701d
la source
Dans le programme Spark, après la création de la session, vous pouvez définir le niveau de journal comme indiqué ci-dessous pour Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing le

Réponses:

158

Exécutez simplement cette commande dans le répertoire spark:

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

Modifiez 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.

poiuytrez
la source
1
Cela a aidé, important de réaliser que log4j.properties n'existe que si vous le créez. Sur ubuntu, je n'avais pas besoin de redémarrer pour que ces modifications prennent effet.
disruptif le
N'a pas travaillé pour moi. Spark 1.5. RHEL 6. CDH 5.5. J'ai essayé de créer un nouveau fichier /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties et de changer comme expliqué ci-dessus. Et j'ai également essayé de modifier le fichier existant /etc/spark/conf/log4j.properties. Aucun effet pour le shell pyspark ni pour le pyspark-shell.
Tagar
devons-nous faire cela pour tous les nœuds du cluster Spark?
nuage
54

Inspiré par le pyspark / tests.py que j'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'appeler juste après la création de SparkContext a réduit les lignes stderr enregistrées pour mon test de 2647 à 163. Cependant, la création du SparkContext lui-même enregistre 163, jusqu'à

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

et je ne sais pas comment les ajuster par programme.

FDS
la source
2
si vous avez des idées sur la façon d'ajuster ces lignes, veuillez partager
Irene
Je pense qu'il n'y a pas de solution directe pour changer le niveau de débogage par défaut dans PySpark .. jusqu'à ce que SparkContext démarre. Parce que sc._jvm est créé uniquement après la création de SC. Vous pouvez toujours modifier cela via le fichier log4j.properies, comme indiqué dans d'autres réponses. Spark doit créer par exemple une variable spark.default.logging qui peut être transmise à SparkConf en tant qu'option pour remplacer le niveau par défaut de l'enregistreur racine.
Tagar du
37

Dans Spark 2.0, vous pouvez également le configurer dynamiquement 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 sparksession par défaut sera déjà disponible.

mdh
la source
Vous venez de supprimer les messages du journal. Mais le code réel s'exécute en arrière-plan. Si vous voyez l'utilisation du processeur. Spark utilise beaucoup de CPU même lorsqu'il est inactif.
hurelhuyag
C'était exactement la solution pour le travail PySpark où le log4jn'est pas accessible.
yeliabsalohcin le
35

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

   log4j.rootCategory=INFO, console

à

    log4j.rootCategory=ERROR, console

Une autre approche consisterait à:

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 aucun journal après cela.

AkhlD
la source
3
la dernière option fonctionne pour spark-shell (scala) mais que devez-vous faire en cas de pyspark sans changer le fichier log4j?
hmi2015
Changer le fichier de propriétés log4j en "warn" serait préférable, mais sinon, cette réponse de wannik fonctionne pour changer le niveau de journal en console pour pyspark stackoverflow.com/a/34487962/127971
michael
32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
wannik
la source
J'ai utilisé ceci pour pyspark. Fonctionne très bien comme un hack one-liner. Je reçois toujours les messages stupides de YarnExecutor morts, ce qui ne devrait pas être une erreur, à mon humble avis. Et ainsi de suite ...
Jatal
2
Cela supprime la journalisation après son exécution, mais il y a malheureusement beaucoup de journaux INFO avant ce point.
DavidJ
28

Pour PySpark, vous pouvez également définir le niveau de journalisation dans vos scripts avec sc.setLogLevel("FATAL"). À partir de la documentation :

Contrôlez 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

Galen Long
la source
Excellente solution qui fonctionne pour les versions de Spark plus récentes que la 1.4 (donc, depuis mi-2015).
Jealie
J'ai essayé cela avec Spark 1.6.2 et Scala et cela ne semble pas fonctionner
Yeikel
@Yeikel Cette solution est pour PySpark. Désolé, cela n'a pas été précisé - je vais modifier la réponse maintenant
Galen Long
15

Vous pouvez utiliser setLogLevel

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

spark.sparkContext.setLogLevel("WARN")
Unmesha SreeVeni
la source
14

Cela peut être dû à la façon dont Spark calcule son chemin de classe. Mon intuition est que le log4j.propertiesfichier de Hadoop apparaît avant celui de Spark sur le chemin de classe, empêchant vos modifications de prendre effet.

Si vous courez

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

puis Spark affichera 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

où se /root/ephemeral-hdfs/conftrouve en tête du chemin des classes.

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

En attendant, voici quelques solutions de contournement:

  • Ajouter export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"à spark-env.sh.
  • Supprimer (ou renommer) /root/ephemeral-hdfs/conf/log4j.properties.
Josh Rosen
la source
Je vous remercie. J'ai essayé d'ajouter cela à mon fichier spark-env.sh et j'ai également essayé de supprimer le fichier log4j.properties tout en obtenant la sortie INFO. J'ai ajouté mon chemin de classe complet à la question.
horatio1701d
Merci pour l'info supplémentaire. Pourriez-vous également publier le contenu de spark-env.sh (vous pouvez biffer des informations privées, comme les noms d'hôte)?
Josh Rosen
Merci. a posté spark-env.sh. Désolé si je ne comprends pas comment mettre en place une configuration de base. Je viens de laisser tout par défaut pour le moment juste pour essayer quelques tests.
horatio1701d
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')

(l'étincelle étant la SparkSession)

Alternativement les anciennes méthodes,

Renommez conf/log4j.properties.templateen conf/log4j.propertiesdans Spark Dir.

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

Différents niveaux de journalisation disponibles:

  • OFF (plus spécifique, pas de journalisation)
  • FATAL (plus spécifique, peu de données)
  • ERREUR - Journal uniquement en cas d'erreurs
  • WARN - Journal uniquement en cas d'avertissements ou d'erreurs
  • INFO (par défaut)
  • DEBUG - Étapes des détails du journal (et tous les journaux indiqués ci-dessus)
  • TRACE (le moins spécifique, beaucoup de données)
  • TOUT (le moins spécifique, toutes les données)
Ani Menon
la source
8

Manière programmatique

spark.sparkContext.setLogLevel("WARN")

Options disponibles

ERROR
WARN 
INFO 
loneStar
la source
5

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/
oleksii
la source
4

Ajoutez simplement le paramètre ci-dessous à votre commande spark-submit

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

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

J'espère que cela aide, bravo!

Gaurav Adurkar
la source
Un autre que j'ai trouvé utile est que vous pouvez spécifier le fichier log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle
2

Cet extrait de code ci-dessous pour les utilisateurs de scala:

Option 1 :

Ci-dessous l'extrait que 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 Spark Session.

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 log4j.properties .. (peut être comme /etc/spark/conf/log4j.properties (où se trouve l'installation Spark) ou votre dossier de projet log4j.properties) puisque vous changez à niveau du module. Cela s'appliquera à toutes les applications.

log4j.rootCategory=ERROR, console

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

Ram Ghadiyaram
la source
1

La façon dont je le fais est:

à l'endroit où je lance le spark-submitscript faire

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

modifiez le INFOniveau de journalisation souhaité, puis exécutez votrespark-submit

user3827333
la source
cp /etc/spark/conf/log4j.properties.template .
deepelement
0

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

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