Come disattivare la registrazione INFO in Spark?


144

Ho installato Spark usando la guida di AWS EC2 e posso avviare il programma bin/pysparkcorrettamente usando lo script per accedere al prompt spark e posso anche eseguire la guida Quick Start con successo.

Tuttavia, non posso per la vita di me capire come fermare tutto il INFOlog dettagliato dopo ogni comando.

Ho provato quasi tutti gli scenari possibili nel codice seguente (commentando, impostando su OFF) all'interno del mio log4j.propertiesfile nella confcartella in cui avvio l'applicazione così come su ciascun nodo e nulla sta facendo nulla. Ottengo ancora la INFOstampa delle istruzioni di registrazione dopo aver eseguito ciascuna istruzione.

Sono molto confuso con come dovrebbe funzionare.

#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

Ecco il mio percorso di classe completo quando uso SPARK_PRINT_LAUNCH_COMMAND:

Comando 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

contenuto di 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"

Nel programma Spark dopo aver creato la sessione è possibile impostare il livello di registro come indicato di seguito per Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext () setLogLevel ( "INFO.");
iKing

Risposte:


158

Basta eseguire questo comando nella directory spark:

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

Modifica 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

Sostituisci alla prima riga:

log4j.rootCategory=INFO, console

di:

log4j.rootCategory=WARN, console

Salva e riavvia la shell. Funziona per me per Spark 1.1.0 e Spark 1.5.1 su OS X.


1
Questo ha aiutato, importante rendersi conto che log4j.properties non esiste se non lo si crea. Su Ubuntu, non ho dovuto riavviare per rendere effettive queste modifiche.
dirompente il

Non ha funzionato per me. Spark 1.5. RHEL 6. CDH 5.5. Ho provato a creare un nuovo file /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties e a cambiare come spiegato sopra. E ho anche provato a modificare il file esistente /etc/spark/conf/log4j.properties. Nessun effetto per pyspark shell né per pyspark-shell.
Tagar,

dobbiamo farlo per tutti i nodi del cluster spark?
nuvola

54

Ispirato da pyspark / tests.py l'ho fatto

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 )

Chiamarlo subito dopo aver creato SparkContext ha ridotto le linee stderr registrate per il mio test dal 2647 al 163. Tuttavia, la creazione dello stesso SparkContext registra 163, fino a

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

e non mi è chiaro come regolarli a livello di programmazione.


2
se hai qualche idea su come regolare quelle linee, ti preghiamo di condividere
Irene

Penso che non esiste una soluzione diretta per modificare il livello di debug predefinito in PySpark .. fino all'avvio di SparkContext. Perché sc._jvm viene creato solo dopo la creazione di SC. Puoi ancora modificarlo tramite il file log4j.properies, sebbene come discusso in altre risposte. Spark dovrebbe creare, ad esempio, la variabile spark.default.logging che può essere passata a SparkConf come opzione per sovrascrivere il livello del Logger root predefinito.
Tagar,

37

In Spark 2.0 puoi anche configurarlo dinamicamente per la tua applicazione usando setLogLevel :

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

Nella console pyspark , sparksarà già disponibile una sessione predefinita .


Hai appena eliminato i messaggi di registro. Ma il codice effettivo è in esecuzione in background. Se vedi l'utilizzo della CPU. Spark utilizza molta CPU anche quando è inattivo.
hurelhuyag,

Questa era esattamente la soluzione per il lavoro di PySpark in cui log4jnon era accessibile.
yeliabsalohcin

35

Modifica il tuo file conf / log4j.properties e cambia la seguente riga:

   log4j.rootCategory=INFO, console

per

    log4j.rootCategory=ERROR, console

Un altro approccio sarebbe quello di:

Fireup spark-shell e digitare quanto segue:

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

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

Successivamente non vedrai alcun registro.


3
l'opzione successiva funziona con spark-shell (scala) ma cosa dovresti fare in caso di pyspark senza cambiare il file log4j?
hmi2015,

Modifica del file delle proprietà log4j a "mettere in guardia" sarebbe preferibile, ma per il resto questa risposta da wannik funziona per cambiare il livello di registrazione per consolare per pyspark stackoverflow.com/a/34487962/127971
michael

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

L'ho usato per Pyspark. Funziona alla grande come un hack one-liner. Ricevo ancora i messaggi stupidi di YarnExecutor, che non dovrebbe essere un errore, imho. E così va ...
jatal

2
Ciò elimina la registrazione dopo l'esecuzione, ma sfortunatamente ci sono molti registri INFO prima di quel punto.
DavidJ,

28

Per PySpark, puoi anche impostare il livello di registro nei tuoi script con sc.setLogLevel("FATAL"). Dai documenti :

Controlla il nostro logLevel. Ciò sovrascrive qualsiasi impostazione del registro definita dall'utente. I livelli di log validi includono: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


Ottima soluzione che funziona con versioni di Spark più recenti della 1.4 (quindi da metà 2015).
Jealie

Ho provato questo con Spark 1.6.2 e Scala e non sembra funzionare
Yeikel

@Yeikel Questa soluzione è per PySpark. Mi dispiace che non sia stato chiarito - ora modificherò la risposta.
Galen Long,

15

Puoi usare setLogLevel

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

spark.sparkContext.setLogLevel("WARN")

14

Ciò può essere dovuto al modo in cui Spark calcola il suo percorso di classe. La mia impressione è quella di Hadooplog4j.properties file venga visualizzato prima di quello di Spark sul percorso di classe, impedendo che le modifiche abbiano effetto.

Se corri

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

quindi Spark stamperà l'intero percorso di classe utilizzato per avviare la shell; nel mio caso, vedo

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

dove /root/ephemeral-hdfs/conf alla testa del sentiero di classe.

Ho aperto un problema [SPARK-2913] per risolvere questo problema nella prossima versione (dovrei avere presto una patch).

Nel frattempo, ecco un paio di soluzioni alternative:

  • Aggiungi export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"aspark-env.sh .
  • Elimina (o rinomina) /root/ephemeral-hdfs/conf/log4j.properties.

Grazie. Ho provato ad aggiungerlo al mio file spark-env.sh e ho anche provato a cancellare il file log4j.properties ma ottenendo comunque l'output INFO. Ho aggiunto il mio percorso di classe completo alla domanda.
horatio1701d

Grazie per le informazioni aggiuntive. Potresti anche pubblicare i contenuti di spark-env.sh (puoi redarre informazioni private, come i nomi host)?
Josh Rosen,

grazie. pubblicato spark-env.sh. Scusate se non capisco bene come avviare una configurazione di base. Ho appena lasciato tutto il più predefinito possibile per ora solo per provare alcuni test.
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')

(spark essendo la SparkSession)

In alternativa i vecchi metodi,

Rinomina conf/log4j.properties.templatein conf/log4j.propertiesin Spark Dir.

Nel log4j.properties, cambia log4j.rootCategory=INFO, consoleinlog4j.rootCategory=WARN, console

Diversi livelli di registro disponibili:

  • OFF (più specifico, nessuna registrazione)
  • FATAL (più specifico, pochi dati)
  • ERRORE: registra solo in caso di errori
  • AVVISO: accedere solo in caso di avvisi o errori
  • INFO (impostazione predefinita)
  • DEBUG - Passaggi dei dettagli del registro (e tutti i registri indicati sopra)
  • TRACCIA (meno specifica, molti dati)
  • TUTTO (meno specifico, tutti i dati)

8

Modo programmatico

spark.sparkContext.setLogLevel("WARN")

Opzioni disponibili

ERROR
WARN 
INFO 

5

L'ho usato con Amazon EC2 con 1 master e 2 slave e 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/

4

Aggiungi semplicemente param qui sotto al tuo comando spark-submit

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

Questo sostituisce temporaneamente il valore di sistema solo per quel lavoro. Controlla il nome esatto della proprietà (log4jspark.root.logger qui) dal file log4j.properties.

Spero che questo aiuti, evviva!


Un altro che ho trovato utile è che puoi specificare il file log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

Questo frammento di codice di seguito per gli utenti scala:

Opzione 1 :

Sotto lo snippet puoi aggiungere a livello di file

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

Opzione 2 :

Nota: che sarà applicabile a tutte le applicazioni che utilizzano la sessione spark.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Opzione 3:

Nota: questa configurazione deve essere aggiunta a log4j.properties .. (potrebbe essere come /etc/spark/conf/log4j.properties (dove è presente l'installazione spark) o al livello della cartella di progetto log4j.properties) poiché si sta cambiando in livello del modulo. Questo sarà applicabile per tutte le applicazioni.

log4j.rootCategory=ERROR, console

IMHO, l'opzione 1 è saggia poiché può essere disattivata a livello di file.


1

Il modo in cui lo faccio è:

nella posizione in cui eseguo lo spark-submitscript do

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

cambiare INFOa che cosa mai livello di registrazione che si desidera e quindi eseguire ilspark-submit


cp /etc/spark/conf/log4j.properties.template .
deepelement

0

Se vuoi continuare a utilizzare la registrazione (funzione di registrazione per Python) puoi provare a dividere le configurazioni per la tua applicazione e per Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.