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 log4jAPI.
Fuente: [ Documentos de configuración de Log4J , sección Configuración]
# 2 Pase log4j.propertiesdurantespark-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.propertiesarchivos desde classpath.
Sin embargo, cuando se usa spark-submitel 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.propertiesmediante spark-submit, agregándolo a la --fileslista 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-optionssi usa el clientmodo. 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-clustercon --filesestarán disponibles en el directorio raíz, por lo que no es necesario agregar ninguna ruta file:log4j.properties.
- ¡Los archivos listados en
--filesdeben 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.propertiesarchivo y se cargará automáticamente junto con las otras configuraciones.
Fuente: documentos de Spark, depuración
Para encontrar tu SPARK_CONF_DIRpuedes 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 confcarpeta, 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
confcarpeta del clúster (más información, método # 3)
- Edite
log4j.propertiesen esa carpeta (ejemplo en el método # 2)
Establezca SPARK_CONF_DIRen 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!