Todos 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:
import org.apache.log4j.{Level, Logger}
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
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!
Añadir -Dlog4j.configuration=<location of configuration file>
a
spark.driver.extraJavaOptions
(para el controlador) o
spark.executor.extraJavaOptions
(para los ejecutores) .
Tenga en cuenta que si usa un archivo, el file:
protocolo debe proporcionarse explícitamente y el archivo debe existir localmente en todos los nodos .
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 usa deploy-mode client
. De otra manera:
cargue un archivo personalizado log4j.properties
mediante spark-submit, agregándolo a la --files
lista de archivos que se cargarán con la aplicación.
Fuente: documentos de Spark, depuración
Pasos:
Ejemplo log4j.properties
:
# Blacklist all to warn level
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
# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO
Ejecución spark-submit
, para el modo de clúster:
spark-submit \
--master yarn \
--deploy-mode cluster \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Tenga en cuenta que debe usar --driver-java-options
si usa el client
modo. Spark docs, Runtime env
Ejecución spark-submit
, para modo cliente:
spark-submit \
--master yarn \
--deploy-mode client \
--driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
--files "/absolute/path/to/your/log4j.properties" \
--class com.github.atais.Main \
"SparkApp.jar"
Notas:
- Los archivos cargados
spark-cluster
con --files
estarán disponibles en el directorio raíz, por lo que no es necesario agregar ninguna ruta file:log4j.properties
.
- ¡Los archivos listados en
--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 .
actualice el $SPARK_CONF_DIR/log4j.properties
archivo y se cargará automáticamente junto con las otras configuraciones.
Fuente: documentos de Spark, depuración
Para encontrar tu SPARK_CONF_DIR
puedes usar spark-shell
:
atais@cluster:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
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 durante spark-submit
.
Para especificar un directorio de configuración diferente al predeterminado “SPARK_HOME/conf”
, puede establecerlo SPARK_CONF_DIR
. Spark utilizará los archivos de configuración ( spark-defaults.conf
, spark-env.sh
, log4j.properties
, etc. ) desde este directorio.
Fuente: Spark docs, Configuración
Pasos:
- Copie la
conf
carpeta del clúster (más información, método # 3)
- Edite
log4j.properties
en esa carpeta (ejemplo en el método # 2)
Establezca SPARK_CONF_DIR
en esta carpeta, antes de ejecutar spark-submit
,
ejemplo:
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
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!