standalone spark cluster apache-spark spark-submit

apache spark - spark - Cómo detener los mensajes INFO que se muestran en la consola de chispa?



spark-shell (14)

Me gustaría detener varios mensajes que están llegando en chispa shell.

Traté de editar el archivo log4j.properties para detener este mensaje.

Aquí está el contenido de 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

Pero los mensajes aún se muestran en la consola.

Aquí hay algunos mensajes de ejemplo

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

¿Cómo detengo esto?


tl; dr

Para Spark Context puedes usar:

sc.setLogLevel(<logLevel>)

donde el nivel de loglevel puede ser TODO, DEPURAR, ERROR, FATAL, INFO, DESACTIVADO, RASTREAR o ADVERTIR.

Detalles-

Internamente, setLogLevel llama a org.apache.log4j.Level.toLevel(logLevel) que luego usa para configurar usando org.apache.log4j.LogManager.getRootLogger().setLevel(level) .

Puede establecer directamente los niveles de registro en OFF usando:

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

Puede configurar el registro predeterminado para el shell Spark en conf/log4j.properties . Utilice conf/log4j.properties.template como punto de partida.

Configuración de niveles de registro en aplicaciones de chispa

En aplicaciones autónomas de Spark o durante la sesión de Spark Shell, use lo siguiente:

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

Deshabilitar el registro (en log4j):

Utilice lo siguiente en conf/log4j.properties para deshabilitar el registro por completo:

log4j.logger.org=OFF

Referencia: Mastering Spark por Jacek Laskowski.


  1. Ajuste conf / log4j.properties como se describe en otra log4j.rootCategory = ERROR, consola
  2. Asegúrese de que al ejecutar su trabajo de chispa pase - la bandera del archivo con la ruta del archivo log4j.properties
  3. Si aún no funciona, es posible que tenga un jar que tenga log4j.properties que se está llamando antes de su nuevo log4j.properties. Elimine ese log4j.properties del jar (si corresponde)

Además de todas las publicaciones anteriores, esto es lo que me solucionó el problema.

Spark usa slf4j para unirse a los registradores. Si log4j no es el primer enlace encontrado, puede editar los archivos log4j.properties todo lo que desee, los registradores ni siquiera se utilizan. Por ejemplo, esto podría ser un posible resultado de SLF4J:

SLF4J: la ruta de clase contiene múltiples enlaces SLF4J. SLF4J: enlace encontrado en [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: Enlace encontrado en [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: consulte http://www.slf4j.org/codes.html#multiple_bindings para obtener una explicación. SLF4J: el enlace real es del tipo [org.slf4j.impl.SimpleLoggerFactory]

Así que aquí se utilizó SimpleLoggerFactory, que no se preocupa por la configuración de log4j.

Excluyendo el paquete slf4j-simple de mi proyecto a través de

<dependency> ... <exclusions> ... <exclusion> <artifactId>slf4j-simple</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency>

resolvió el problema, ya que ahora se usa el enlace del registrador log4j y se cumple cualquier configuración en log4j.properties. FYI mi archivo de propiedades log4j contiene (además de la configuración normal)

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

¡Espero que esto ayude!


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:

Inicie spark-shell 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.

Otras opciones para Nivel incluyen: all , debug , error , fatal , info , off , trace , trace_int , warn

Los detalles sobre cada uno se pueden encontrar en la documentación.


En Python / Spark podemos hacer:

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 )

Después de definir Sparkcontaxt ''sc'', llame a esta función por: silent_logs (sc)


Establece deshabilitar los registros configurando su nivel en OFF de la siguiente manera:

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

o edite el archivo de registro y configure el nivel de registro como desactivado simplemente cambiando la siguiente propiedad:

log4j.rootCategory=OFF, console


Gracias @AkhlD y @Sachin Janani por sugerir cambios en el archivo .conf .

El siguiente código resolvió mi problema:

1) Se agregó import org.apache.log4j.{Level, Logger} en la sección de importación

2) Se agregó la siguiente línea después de la creación del objeto de contexto de chispa, es decir, después de val sc = new SparkContext(conf) :

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


Justo después de iniciar el tipo de spark-shell ;

sc.setLogLevel("ERROR")

En Spark 2.0:

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


Las respuestas anteriores son correctas pero no me ayudaron exactamente porque había información adicional que necesitaba.

Acabo de configurar Spark, por lo que el archivo log4j aún tenía el sufijo ''.template'' y no se leía. Creo que el registro se establece de forma predeterminada en la configuración de registro del núcleo de Spark.

Entonces, si eres como yo y descubres que las respuestas anteriores no ayudaron, entonces tal vez tú también tengas que eliminar el sufijo ''.template'' de tu archivo log4j conf y lo anterior funciona perfectamente.

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


Simple de hacer en la línea de comando ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" otras opciones ...


Solo agrego esta línea a todos mis scripts de pyspark en la parte superior justo debajo de las declaraciones de importación.

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

ejemplo de encabezado de mis scripts de pyspark

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


Una idea interesante es utilizar el RollingAppender como se sugiere aquí: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ para que no "polute" el espacio de la consola, pero todavía podrá ver los resultados en $ 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

Otro método que resuelve la causa es observar qué tipo de registros normalmente tiene (provenientes de diferentes módulos y dependencias) y establecer para cada uno la granularidad para el registro, al tiempo que convierte los registros de terceros "silenciosos" que son demasiado detallados:

Por ejemplo,

# 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


Use el comando a continuación para cambiar el nivel de registro mientras envía la aplicación usando spark-submit o spark-sql:

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

Nota: reemplace <file path>/log4j.xml con la ruta relativa a donde se almacena el archivo log4j.xml (a continuación).

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

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <logger name="org.apache.spark"> <level value="error" /> </logger> <logger name="org.spark-project"> <level value="error" /> </logger> <logger name="org.apache.hadoop"> <level value="error" /> </logger> <logger name="io.netty"> <level value="error" /> </logger> <logger name="org.apache.zookeeper"> <level value="error" /> </logger> <logger name="org"> <level value="error" /> </logger> <root> <priority value ="ERROR" /> <appender-ref ref="console" /> </root> </log4j:configuration>

Reemplace ConsoleAppender en log4j.xml si necesita escribir registros en el archivo en lugar de en la consola. LOG_DIR es una variable para el directorio de registros que puede suministrar utilizando spark-submit --conf "spark.driver.extraJavaOptions=-D .

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${LOG_DIR}"/> <param name="datePattern" value="''.''yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/> </layout> </appender>


sparkContext.setLogLevel("OFF")