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"
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.
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.
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.
>>> log4j = sc._jvm.org.Apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
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
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.
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
où /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:
export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"
à spark-env.sh
./root/ephemeral-hdfs/conf/log4j.properties
.Vous pouvez utiliser setLogLevel
val spark = SparkSession
.builder()
.config("spark.master", "local[1]")
.appName("TestLog")
.getOrCreate()
spark.sparkContext.setLogLevel("WARN")
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:
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/
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
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.
Manière programmatique
spark.sparkContext.setLogLevel("WARN")
Options disponibles
ERROR
WARN
INFO
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!
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')