it-swarm-eu.dev

Come disattivare la registrazione INFO in Spark?

Ho installato Spark utilizzando la guida di AWS EC2 e posso avviare il programma con lo script bin/pyspark per ottenere il Prompt di scintilla e anche eseguire correttamente la Query di avvio rapido.

Tuttavia, non posso per la vita di me capire come fermare tutto il verbose INFO logging dopo ogni comando.

Ho provato quasi tutti gli scenari possibili nel codice seguente (commentando, impostando su OFF) all'interno del mio file log4j.properties nella cartella conf in cui lancio l'applicazione da e su ciascun nodo e nulla sta facendo nulla. Ricevo ancora la stampa delle istruzioni INFO dopo l'esecuzione di ogni istruzione.

Sono molto confuso da 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 classpath completo quando utilizzo 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"
111
horatio1701d

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 tua shell. Funziona per me per Spark 1.1.0 e Spark 1.5.1 su OS X.

136
poiuytrez

Ispirato dal pyspark/tests.py che 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 )

Chiamando questo appena dopo aver creato SparkContext ridotte linee di stderr registrate per il mio test da 2647 a 163. Tuttavia, la creazione dello SparkContext stesso 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.

45
FDS

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

   log4j.rootCategory=INFO, console

a

    log4j.rootCategory=ERROR, console

Un altro approccio potrebbe essere:

Fire-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)

Dopo questo non vedrai nessun registro.

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

È anche possibile impostare il livello di registro negli script con sc.setLogLevel("FATAL"). Dalla docs :

Controlla il nostro logLevel. Questo sostituisce tutte le impostazioni del registro definite dall'utente. I livelli di registro validi includono: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN

23
Galen Long

In Spark 2.0 puoi anche configurarlo in modo dinamico 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, una sessione spark predefinita sarà già disponibile.

19
mdh

Ciò potrebbe essere dovuto al modo in cui Spark calcola il suo percorso di classe. La mia impressione è che il file log4j.properties di Hadoop appaia davanti a Spark sul classpath, impedendo che le tue modifiche diventino effettive.

Se corri 

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-Shell

quindi Spark stamperà l'intero classpath utilizzato per avviare 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 è all'inizio del classpath.

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" a spark-env.sh.
  • Elimina (o rinomina) /root/ephemeral-hdfs/conf/log4j.properties.
13
Josh Rosen

Puoi usare 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')

(scintilla essendo la SparkSession)

In alternativa i vecchi metodi,

Rinominare conf/log4j.properties.template in conf/log4j.properties in Spark Dir.

In log4j.properties, cambia log4j.rootCategory=INFO, console in log4j.rootCategory=WARN, console

Diversi livelli di registro disponibili:

  • OFF (più specifico, nessuna registrazione)
  • FATAL (più specifici, pochi dati)
  • ERRORE: registra solo in caso di errori
  • WARN: registra solo in caso di avvisi o errori 
  • INFO (predefinito)
  • DEBUG - Registra i passaggi dei dettagli (e tutti i registri sopra indicati)
  • TRACE (meno specifico, molti dati)
  • TUTTO (meno specifico, tutti i dati)
6
Ani Menon

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/
5
oleksii

Il modo in cui lo faccio è:

nella posizione in cui eseguo lo script spark-submit

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

cambia INFO in qualsiasi livello di registrazione desideri e poi esegui il tuo spark-submit

1
user3827333

Questo snippet di codice riportato di seguito per gli utenti di scala:

Opzione 1:

Sotto snippet è possibile 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 al file log4j.properties .. (potrebbe essere come /etc/spark/conf/log4j.properties (dove è presente l'installazione spark) o il livello della cartella del progetto log4j.properties) poiché si sta cambiando a livello del modulo. Questo sarà applicabile a tutte le applicazioni.

log4j.rootCategory=ERROR, console

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

1
Ram Ghadiyaram

Aggiungi semplicemente sotto il param al comando spark-submit

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

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

Spero che questo aiuti, evviva!

0
Gaurav Adurkar

Se si desidera continuare a utilizzare la registrazione (funzione di registrazione per Python), è possibile provare a suddividere le configurazioni per l'applicazione e per Spark:

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