Come smettere di visualizzare i messaggi INFO sulla console spark?

Mi piacerebbe fermare vari messaggi che stanno arrivando su spark shell.

Ho provato a modificare il file log4j.properties per bloccare questi messaggi.

Ecco i contenuti di log4j.properties

 # Define the root logger with appender file log4j.rootCategory=WARN, 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 

Ma i messaggi vengono ancora visualizzati sulla console.

Ecco alcuni messaggi di esempio

 15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster 15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba 15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B. 15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728) 15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager 15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM 15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager 15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server 15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star 

Come posso fermarli?

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

 log4j.rootCategory=INFO, console 

a

 log4j.rootCategory=ERROR, console 

Un altro approccio sarebbe quello di:

Inizia la scintilla e scrivi quanto segue:

 import org.apache.log4j.Logger import org.apache.log4j.Level Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) 

Dopo questo non vedrai nessun registro.

Altre opzioni per Livello includono: all , debug , error , fatal , info , off , trace , trace_int , warn

Dettagli su ciascuno possono essere trovati nella documentazione.

Subito dopo l’inizio spark-shell tipo di spark-shell ;

 sc.setLogLevel("ERROR") 

In Spark 2.0:

 spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("ERROR") 

Grazie a @AkhlD e @Sachin Janani per aver suggerito le modifiche nel file .conf .

Il seguente codice ha risolto il mio problema:

1) Aggiunto import org.apache.log4j.{Level, Logger} nella sezione di importazione

2) Aggiunta la seguente riga dopo la creazione di object contesto spark cioè dopo val sc = new SparkContext(conf) :

 val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) 

Disabilita i registri impostandone il livello su OFF come segue:

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

oppure modifica il file di registro e imposta il livello di log su off solo cambiando la seguente proprietà:

 log4j.rootCategory=OFF, console 

Utilizzare il comando seguente per modificare il livello di registro durante l’invio dell’applicazione utilizzando spark-submit o spark-sql:

 spark-submit \ --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" \ --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" 

Nota: sostituire /log4j.xml con il percorso relativo a dove è archiviato il file log4j.xml (sotto).

Log4j.properties:

 log4j.rootLogger=ERROR, console # set the log level for these components log4j.logger.com.test=DEBUG log4j.logger.org=ERROR log4j.logger.org.apache.spark=ERROR log4j.logger.org.spark-project=ERROR log4j.logger.org.apache.hadoop=ERROR log4j.logger.io.netty=ERROR log4j.logger.org.apache.zookeeper=ERROR # add a ConsoleAppender to the logger stdout to write to the console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout # use a simple message format log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

log4j.xml

                                 

Le risposte di cui sopra sono corrette ma non mi hanno aiutato esattamente in quanto erano necessarie ulteriori informazioni.

Ho appena installato Spark, quindi il file log4j aveva ancora il suffisso ‘.template’ e non veniva letto. Credo che il logging sia quindi predefinito su conf. Core di Spark.

Quindi, se sei come me e scopri che le risposte di cui sopra non sono state d’aiuto, forse dovresti rimuovere anche il suffisso ‘.template’ dal tuo file log4j conf e quindi funziona perfettamente!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html

Ho appena aggiunto questa riga a tutti i miei script pyspark in cima appena sotto le istruzioni di importazione.

 SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR") 

esempio di intestazione dei miei script pyspark

 from pyspark.sql import SparkSession, functions as fs SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR") 

tl; dr

Per Spark Context puoi usare:

 sc.setLogLevel() 

dove loglevel può essere ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE o WARN.


Dettagli-

Internamente, setLogLevel chiama org.apache.log4j.Level.toLevel(logLevel) che quindi usa per impostare usando org.apache.log4j.LogManager.getRootLogger().setLevel(level) .

È ansible impostare direttamente i livelli di registrazione su OFF utilizzando:

 LogManager.getLogger("org").setLevel(Level.OFF) 

È ansible impostare la registrazione predefinita per Spark shell in conf/log4j.properties . Usa conf/log4j.properties.template come punto di partenza.

Impostazione dei livelli di registro nelle applicazioni Spark

Nelle applicazioni Spark standalone o durante la sessione Spark Shell, utilizzare quanto segue:

 import org.apache.log4j.{Level, Logger} Logger.getLogger(classOf[RackResolver]).getLevel Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) 

Disabilitazione della registrazione (in log4j):

Utilizzare quanto segue in conf/log4j.properties per disabilitare completamente la registrazione:

 log4j.logger.org=OFF 

Riferimento: Mastering Spark di Jacek Laskowski.

In Python / Spark possiamo fare:

 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 ) 

Dopo aver definito Sparkcontaxt ‘sc’, chiama questa funzione: quiet_logs (sc)

Un’idea interessante è usare RollingAppender come suggerito qui: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ in modo da non “polare” lo spazio della console, ma essere ancora in grado di vedere i risultati sotto $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.

  log4j.rootLogger=INFO, rolling log4j.appender.rolling=org.apache.log4j.RollingFileAppender log4j.appender.rolling.layout=org.apache.log4j.PatternLayout log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n log4j.appender.rolling.maxFileSize=50MB log4j.appender.rolling.maxBackupIndex=5 log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log log4j.appender.rolling.encoding=UTF-8 

Un altro metodo che risolve la causa consiste nell’osservare quale tipo di registrazioni utilizzi (provenienti da diversi moduli e dipendenze) e impostare per ciascuna la granularità per la registrazione, mentre si triggersno i registri di terze parti “silenziosi” troppo prolissi:

Per esempio,

  # Silence akka remoting log4j.logger.Remoting=ERROR log4j.logger.akka.event.slf4j=ERROR log4j.logger.org.spark-project.jetty.server=ERROR log4j.logger.org.apache.spark=ERROR log4j.logger.com.anjuke.dm=${dm.logging.level} 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 

Semplice da fare sulla linea di comando …

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" … altre opzioni …

  1. Regolare conf / log4j.properties come descritto da altri log4j.rootCategory = ERROR, console
  2. Assicurati che durante l’esecuzione del tuo lavoro di scintilla passi il flag –file con il percorso del file log4j.properties
  3. Se continua a non funzionare, potresti avere un jar con log4j.properties chiamato prima del tuo nuovo log4j.properties. Rimuovere log4j.properties dal jar (se appropriato)
 sparkContext.setLogLevel("OFF") 

Oltre a tutti i post di cui sopra, ecco cosa ha risolto il problema per me.

Spark usa slf4j per collegarsi ai logger. Se log4j non è la prima associazione trovata, è ansible modificare i file log4j.properties tutto ciò che si desidera, i logger non vengono neppure utilizzati. Ad esempio, questo potrebbe essere un ansible output di SLF4J:

SLF4J: percorso class contiene più binding SLF4J. SLF4J: associazione trovata in [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar! / Org / slf4j / impl / StaticLoggerBinder.class] SLF4J: associazione trovata in [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: vedere http://www.slf4j.org/codes.html#multiple_bindings per una spiegazione. SLF4J: l’associazione effettiva è di tipo [org.slf4j.impl.SimpleLoggerFactory]

Quindi qui è stato utilizzato SimpleLoggerFactory, che non interessa le impostazioni di log4j.

Escludendo il pacchetto slf4j-simple dal mio progetto tramite

  ...  ...  slf4j-simple org.slf4j    

risolto il problema, poiché ora viene utilizzato il collegamento del logger log4j e viene rispettata qualsiasi impostazione in log4j.properties. FYI il mio file di proprietà log4j contiene (oltre alla normale configurazione)

 log4j.rootLogger=WARN, stdout ... log4j.category.org.apache.spark = WARN log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF 

Spero che questo ti aiuti!

Aggiungi semplicemente sotto il parametro al comando spark-submit

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

Controllare il nome esatto della proprietà (log4jspark.root.logger qui) dal file log4j.properties. Spero che questo aiuti, evviva!