Me gustaría detener varios mensajes que llegan en spark shell.
Traté de editar el log4j.properties
archivo para detener este mensaje.
Aquí están los contenidos 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 todavía 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?
apache-spark
log4j
spark-submit
Vishwas
fuente
fuente
Justo después de comenzar el
spark-shell
tipo;En Spark 2.0 (Scala):
Documentos de API: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession
Para Java:
fuente
Gracias @AkhlD y @Sachin Janani por sugerir cambios en el
.conf
archivo.El siguiente código resolvió mi problema:
1) Agregado
import org.apache.log4j.{Level, Logger}
en la sección de importación2) 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)
:fuente
Use el siguiente comando para cambiar el nivel de registro al enviar la aplicación usando spark-submit o spark-sql:
Nota: reemplace
<file path>
dondelog4j
se almacena el archivo de configuración.Log4j.properties:
log4j.xml
Cambie a FileAppender en log4j.xml si desea escribir registros en el archivo en lugar de la consola.
LOG_DIR
es una variable para el directorio de registros que puede proporcionar utilizandospark-submit --conf "spark.driver.extraJavaOptions=-D
.Otra cosa importante a entender aquí es que, cuando el trabajo se inicia en modo distribuido (clúster de despliegue en modo y maestro como hilo o mesos), el archivo de configuración log4j debe existir en los nodos de controlador y de trabajo (
log4j.configuration=file:<file path>/log4j.xml
) de lo contrario log4j init se quejará.Sugerencia para resolver este problema
Mantenga el archivo de configuración log4j en el sistema de archivos distribuido (HDFS o mesos) y agregue la configuración externa utilizando Log4j PropertyConfigurator . o use sparkContext addFile para que esté disponible en cada nodo y luego use log4j PropertyConfigurator para recargar la configuración.
fuente
org
registra todos los registros que tradicionalmente provienen del registrador predeterminado.Log4j.properties
archivo? No parece ser usado. ¿Está simplemente documentando las propiedades establecidas en el archivo XML?--files
en el comando spark-submit para hacer que log4j.properties esté disponible en todos los nodos.Log4.properties
debajomain/resources
en caso de que no existaTodos los métodos recopilados con ejemplos.
Introducción
En realidad, hay muchas formas de hacerlo . Algunos son más difíciles de otros, pero depende de usted cuál le conviene más. Trataré de mostrarlos a todos.
# 1 de forma programática en su aplicación
Parece ser la más fácil, pero deberá volver a compilar su aplicación para cambiar esa configuración. Personalmente, no me gusta pero funciona bien.
Ejemplo:
Puede lograr mucho más simplemente usando
log4j
API.Fuente: [ Documentos de configuración de Log4J , sección Configuración]
# 2 Pase
log4j.properties
durantespark-submit
Este es muy complicado, pero no imposible. Y mi favorito
Log4J durante el inicio de la aplicación siempre está buscando y cargando
log4j.properties
archivos desde classpath.Sin embargo, cuando se usa
spark-submit
el classpath de Spark Cluster tiene prioridad sobre el classpath de la aplicación. ¡Es por eso que poner este archivo en su fat-jar no anulará la configuración del clúster!Para satisfacer la última condición, puede cargar el archivo en la ubicación disponible para los nodos (como
hdfs
) o acceder a él localmente con el controlador si lo usadeploy-mode client
. De otra manera:Fuente: documentos de Spark, depuración
Pasos:
Ejemplo
log4j.properties
:Ejecución
spark-submit
, para el modo de clúster:Tenga en cuenta que debe usar
--driver-java-options
si usa elclient
modo. Spark docs, Runtime envEjecución
spark-submit
, para modo cliente:Notas:
spark-cluster
con--files
estarán disponibles en el directorio raíz, por lo que no es necesario agregar ninguna rutafile:log4j.properties
.--files
deben ser provistos con una ruta absoluta!file:
El prefijo en la configuración URI es obligatorio.# 3 Editar clústeres
conf/log4j.properties
Esto cambia el archivo de configuración de registro global .
Fuente: documentos de Spark, depuración
Para encontrar tu
SPARK_CONF_DIR
puedes usarspark-shell
:Ahora solo edite
/var/lib/spark/latest/conf/log4j.properties
(con el ejemplo del método # 2) y todas sus aplicaciones compartirán esta configuración.# 4 Anular directorio de configuración
Si le gusta la solución n. ° 3, pero desea personalizarla por aplicación, puede copiar la
conf
carpeta, editar el contenido y especificarla como la configuración raíz durantespark-submit
.Fuente: Spark docs, Configuración
Pasos:
conf
carpeta del clúster (más información, método # 3)log4j.properties
en esa carpeta (ejemplo en el método # 2)Establezca
SPARK_CONF_DIR
en esta carpeta, antes de ejecutarspark-submit
,ejemplo:
Conclusión
No estoy seguro de si hay algún otro método, pero espero que esto cubra el tema de la A a la Z. Si no, ¡no dudes en enviarme un comentario!
¡Disfruta tu camino!
fuente
Establece deshabilitar los registros configurando su nivel en OFF de la siguiente manera:
o edite el archivo de registro y desactive el nivel de registro simplemente cambiando la siguiente propiedad:
fuente
Solo agrego esta línea a todos mis scripts de pyspark en la parte superior, justo debajo de las declaraciones de importación.
ejemplo de encabezado de mis scripts de pyspark
fuente
Las respuestas anteriores son correctas, pero no me ayudaron exactamente, ya que necesitaba información adicional.
Acabo de configurar Spark para que el archivo log4j todavía tenga el sufijo '.template' y no se esté leyendo. Creo que el inicio de sesión predeterminado es Spark core logging conf.
Entonces, si eres como yo y descubres que las respuestas anteriores no te ayudaron, entonces tal vez también debas eliminar el sufijo '.template' de tu archivo conf de log4j y ¡entonces lo anterior funciona perfectamente!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
fuente
En Python / Spark podemos hacer:
Después de definir Sparkcontaxt 'sc', llame a esta función por: quiet_logs (sc)
fuente
tl; dr
Detalles-
Internamente,
setLogLevel
llamadasorg.apache.log4j.Level.toLevel(logLevel)
que luego usa para configurar el usoorg.apache.log4j.LogManager.getRootLogger().setLevel(level)
.Puede configurar el inicio de sesión predeterminado para Spark Shell en
conf/log4j.properties
. Úseloconf/log4j.properties.template
como punto de partida.Establecer niveles de registro en aplicaciones de Spark
En las aplicaciones independientes de Spark o durante la sesión de Spark Shell, use lo siguiente:
Deshabilitar el registro (en log4j):
Use lo siguiente
conf/log4j.properties
para deshabilitar el registro por completo:Referencia: Mastering Spark por Jacek Laskowski.
fuente
Simple de hacer en la línea de comando ...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..otras opciones..fuente
spark2-submit
?Simplemente agregue el siguiente parámetro a su comando spark-shell O spark-submit
Verifique el nombre exacto de la propiedad (log4jspark.root.logger aquí) del archivo log4j.properties. Espero que esto ayude, ¡salud!
fuente
Una idea interesante es usar el RollingAppender como se sugiere aquí: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ para que no "contamine" el espacio de la consola, pero aún podrá ver los resultados en $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.
Otro método que resuelve la causa es observar qué tipo de registros usualmente tiene (provenientes de diferentes módulos y dependencias), y establecer para cada uno la granularidad para el registro, mientras se vuelven registros "silenciosos" de terceros que son demasiado detallados:
Por ejemplo,
fuente
fuente
fuente
val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR)
funcionóAdemás de todas las publicaciones anteriores, esto es lo que resolvió el problema para mí.
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, ni siquiera se utilizan los registradores. Por ejemplo, esto podría ser una posible salida SLF4J:
Entonces, aquí se usó SimpleLoggerFactory, que no se preocupa por la configuración de log4j.
Excluyendo el paquete slf4j-simple de mi proyecto a través de
resolvió el problema, ya que ahora se utiliza el enlace log4j logger y se cumple cualquier configuración en log4j.properties. FYI mi archivo de propiedades log4j contiene (además de la configuración normal)
¡Espero que esto ayude!
fuente
Este me funcionó. Para que solo se muestren mensajes de ERROR como
stdout
, ellog4j.properties
archivo puede verse así:fuente
Si no tiene la capacidad de editar el código Java para insertar las
.setLogLevel()
declaraciones y no desea que se implementen aún más archivos externos, puede usar una forma de fuerza bruta para resolver esto. Simplemente filtre las líneas INFO con grep.fuente
Si alguien más está atrapado en esto,
nada de lo anterior funcionó para mí. Tuve que quitar
desde mi build.gradle para que los registros desaparezcan. TLDR: no importe ningún otro marco de registro, debería estar bien simplemente usando
org.apache.log4j.Logger
fuente
Otra forma de detener registros por completo es:
Esto funcionó para mí. Un NullAppender es
fuente