¿Cómo desactivar el inicio de sesión INFO en Spark?

144

Instalé Spark usando la guía AWS EC2 y puedo iniciar bien el programa usando el bin/pyspark script para llegar al indicador de chispa y también puedo hacer el inicio rápido exitosamente.

Sin embargo, no puedo por mi vida descubrir cómo detener todo el INFOregistro detallado después de cada comando.

He intentado casi todos los escenarios posibles en el código a continuación (comentando, configurando como DESACTIVADO) dentro de mi log4j.propertiesarchivo en la confcarpeta desde donde inicio la aplicación, así como en cada nodo y nada está haciendo nada. Todavía recibo el registroINFO impresión de las declaraciones de después de ejecutar cada declaración.

Estoy muy confundido con cómo se supone que esto funciona.

#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

Aquí está mi classpath completo cuando 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

contenido 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
fuente
En el programa Spark después de crear la sesión, puede establecer el nivel de registro como se indica a continuación para Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing

Respuestas:

158

Simplemente ejecute este comando en el directorio spark:

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

Editar 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

Reemplazar en la primera línea:

log4j.rootCategory=INFO, console

por:

log4j.rootCategory=WARN, console

Guarde y reinicie su shell. A mí me funciona para Spark 1.1.0 y Spark 1.5.1 en OS X.

poiuytrez
fuente
1
Esto ayudó, es importante darse cuenta de que log4j.properties no existe a menos que lo cree. En ubuntu, no necesitaba reiniciar para que estos cambios tuvieran efecto.
disruptivo
No funciono para mi. Chispa 1.5. RHEL 6. CDH 5.5. Intenté crear un nuevo archivo /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties y cambiar como se explicó anteriormente. Y también intenté editar el archivo existente /etc/spark/conf/log4j.properties. No tiene efecto para pyspark shell ni para pyspark-shell.
Tagar
¿Necesitamos hacer esto para todos los nodos en el grupo de chispas?
nube
54

Inspirado por el pyspark / tests.py que hice

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 )

Llamar a esto justo después de crear SparkContext redujo las líneas stderr registradas para mi prueba de 2647 a 163. Sin embargo, crear el SparkContext en sí registra 163, hasta

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

y no me queda claro cómo ajustarlos programáticamente.

FDS
fuente
2
si tiene alguna idea sobre cómo ajustar esas líneas, por favor comparta
Irene
Creo que no hay una solución directa para cambiar el nivel de depuración predeterminado en PySpark ... hasta que se inicie SparkContext. Porque sc._jvm se crea solo después de que se crea SC. Todavía puede cambiar eso a través del archivo log4j.properies, como se discutió en otras respuestas. Spark debería crear, por ejemplo, la variable spark.default.logging que se puede pasar a SparkConf como una opción para anular el nivel predeterminado de Root Logger.
Tagar
37

En Spark 2.0 también puede configurarlo dinámicamente para su aplicación usando setLogLevel :

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

En la consola de pyspark , una sparksesión predeterminada ya estará disponible.

mdh
fuente
Acaba de suprimir los mensajes de registro. Pero el código real se está ejecutando en segundo plano. Si ve el uso de la CPU. Spark usando mucha CPU incluso cuando está inactivo.
hurelhuyag
Esta fue exactamente la solución para el trabajo de PySpark donde el log4jno es accesible.
yeliabsalohcin
35

Edite su archivo conf / log4j.properties y cambie la siguiente línea:

   log4j.rootCategory=INFO, console

a

    log4j.rootCategory=ERROR, console

Otro enfoque sería:

Encienda la chispa y escriba lo siguiente:

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

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

No verá ningún registro después de eso.

AkhlD
fuente
3
la opción posterior funciona para spark-shell (scala) pero ¿qué debe hacer en caso de pyspark sin cambiar el archivo log4j?
hmi2015
Sería preferible cambiar el archivo de propiedades log4j a "advertir", pero de lo contrario esta respuesta de wannik funciona para cambiar el nivel de registro a la consola para pyspark stackoverflow.com/a/34487962/127971
michael
32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
wannik
fuente
Usé esto para pyspark. Funciona muy bien como un truco de una sola línea. Todavía recibo el tonto YarnExecutor murió mensajes, que no debería ser un error, en mi humilde opinión. Y así sigue ...
jatal
2
Esto suprime el registro después de que se ejecuta, pero desafortunadamente hay muchos registros INFO antes de ese punto.
DavidJ
28

Para PySpark, también puede establecer el nivel de registro en sus scripts con sc.setLogLevel("FATAL"). De los documentos :

Controla nuestro logLevel. Esto anula cualquier configuración de registro definida por el usuario. Los niveles de registro válidos incluyen: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN

Galen Long
fuente
Gran solución que funciona para versiones de Spark más recientes que la 1.4 (es decir, desde mediados de 2015).
Jealie
Intenté esto con Spark 1.6.2 y Scala y parece que no funciona
Yeikel
@Yeikel Esta solución es para PySpark. Lo siento, eso no se aclaró. Editaré la respuesta ahora.
Galen Long
15

Puedes usar setLogLevel

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

spark.sparkContext.setLogLevel("WARN")
Unmesha SreeVeni
fuente
14

Esto puede deberse a cómo Spark calcula su classpath. Mi presentimiento es que Hadooplog4j.properties archivo aparece antes que Spark en el classpath, evitando que sus cambios surtan efecto.

Si tu corres

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

luego Spark imprimirá el classpath completo utilizado para iniciar el shell; en mi caso veo

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

donde /root/ephemeral-hdfs/confestá a la cabeza del classpath.

He abierto un problema [SPARK-2913] para solucionar esto en la próxima versión (debería tener un parche pronto).

Mientras tanto, aquí hay un par de soluciones:

  • Añadir export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"aspark-env.sh .
  • Eliminar (o renombrar) /root/ephemeral-hdfs/conf/log4j.properties.
Josh Rosen
fuente
Gracias. Traté de agregar eso a mi archivo spark-env.sh y también intenté eliminar el archivo log4j.properties pero aún obtengo la salida INFO. He agregado mi classpath completo a la pregunta.
horatio1701d
Gracias por la información extra. ¿Podría publicar también el contenido de spark-env.sh (puede redactar información privada, como nombres de host)?
Josh Rosen
gracias. publicado spark-env.sh. Lo siento si no entiendo cómo hacer funcionar una configuración base. Dejé todo lo más predeterminado posible por ahora solo para probar algunas pruebas.
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')

(chispa siendo la sesión de chispa)

Alternativamente, los viejos métodos,

Cambiar el nombre conf/log4j.properties.templatea conf/log4j.propertiesen Spark Dir.

En el log4j.properties, cambie log4j.rootCategory=INFO, consolealog4j.rootCategory=WARN, console

Diferentes niveles de registro disponibles:

  • APAGADO (más específico, sin registro)
  • FATAL (más específico, poca información)
  • ERROR: registre solo en caso de errores
  • ADVERTENCIA: inicie sesión solo en caso de advertencias o errores
  • INFO (predeterminado)
  • DEPURACIÓN: pasos de detalles de registro (y todos los registros mencionados anteriormente)
  • TRACE (menos específico, muchos datos)
  • TODOS (menos específicos, todos los datos)
Ani Menon
fuente
8

Forma programática

spark.sparkContext.setLogLevel("WARN")

Opciones Disponibles

ERROR
WARN 
INFO 
estrella solitaria
fuente
5

Utilicé esto con Amazon EC2 con 1 maestro y 2 esclavos y 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
fuente
4

Simplemente agregue el siguiente parámetro a su comando de envío de chispa

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

Esto anula el valor del sistema temporalmente solo para ese trabajo. Verifique el nombre exacto de la propiedad (log4jspark.root.logger aquí) del archivo log4j.properties.

Espero que esto ayude, ¡salud!

Gaurav Adurkar
fuente
Otro que me pareció útil es que puede especificar el archivo log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle
2

Este fragmento de código a continuación para usuarios de scala:

Opción 1 :

Debajo del fragmento puede agregar a nivel de archivo

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

Opcion 2 :

Nota: que será aplicable para todas las aplicaciones que utilizan sesión de chispa.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Opcion 3:

Nota: Esta configuración debe agregarse a su log4j.properties .. (podría ser /etc/spark/conf/log4j.properties (donde está la instalación de la chispa) o el nivel de carpeta de su proyecto log4j.properties) ya que está cambiando en nivel de módulo Esto será aplicable para toda la aplicación.

log4j.rootCategory=ERROR, console

En mi humilde opinión, la opción 1 es una buena manera, ya que se puede desactivar a nivel de archivo.

Ram Ghadiyaram
fuente
1

La forma en que lo hago es:

en la ubicación donde ejecuto el spark-submitscript

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

cambie INFOa cualquier nivel de registro que desee y luego ejecute suspark-submit

usuario3827333
fuente
cp /etc/spark/conf/log4j.properties.template .
profundización
0

Si desea seguir utilizando el registro (instalación de registro para Python), puede intentar dividir las configuraciones para su aplicación y para Spark:

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