spark retainedjobs maxretries jars deploy defaultcores logging log4j apache-spark yarn

logging - retainedjobs - spark port maxretries



Cómo iniciar sesión usando log4j en el sistema de archivos local dentro de una aplicación Spark que se ejecuta en YARN? (5)

Estoy construyendo una aplicación Apache Spark Streaming y no puedo hacer que se registre en un archivo en el sistema de archivos local cuando se ejecuta en YARN . ¿Cómo se puede lograr esto?

log4.properties archivo log4.properties para que pueda escribir correctamente en un archivo de registro en el directorio /tmp en el sistema de archivos local (se muestra a continuación parcialmente):

log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=/tmp/application.log log4j.appender.file.append=false log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

Cuando ejecuto mi aplicación Spark localmente usando el siguiente comando:

spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar

Funciona bien y puedo ver que los mensajes de registro se escriben en /tmp/application.log en mi sistema de archivos local.

Pero cuando ejecuto la misma aplicación a través de YARN, por ejemplo

spark-submit --class myModule.myClass --master yarn-client --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

o

spark-submit --class myModule.myClass --master yarn-cluster --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar

No puedo ver ningún /tmp/application.log en el sistema de archivos local de la máquina que ejecuta YARN.

Qué me estoy perdiendo.


Alternativamente, puede usar PropertyConfigurator de log4j para definir sus propiedades de registro personalizadas.

Ex.

import com.foo.Bar; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class MySparkApp { static Logger logger = Logger.getLogger(MySparkApp.class.getName()); public static void main(String[] args) { // Location to property file PropertyConfigurator.configure(args[0]); logger.info("Entering application."); logger.info("Exiting application."); } }

Su archivo de propiedades debe tener los siguientes accesorios,

log4j.appender.file=org.apache.log4j.FileAppender log4j.appender.file.File=/tmp/application.log log4j.appender.file.append=false log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

EDITAR: Actualizando el enlace a log4j documentos. Spark usa log4j 2, no v1.2

Ref: http://logging.apache.org/log4j/2.x/


En su archivo log4j.properties, también debe modificar log4j.rootCategory desde INFO,console a INFO,file .

log4j.rootCategory=INFO, console log4j.rootCategory=INFO,file


Enviar trabajo así:

spark-submit --class com.X.datahub.djobi.Djobi / --name "djobi-dev" / --master "local" / --num-executors 1 / --deploy-mode client / --driver-memory 1g / --driver-cores 2 / --executor-memory 6g / --executor-cores 4 / --driver-java-options "-Dlog4j.debug=true -Dlog4j.configuration=config/log4j.properties" / --conf "spark.memory.fraction=0.4" / --conf "spark.yarn.executor.memoryOverhead=1024" / --conf "spark.executor.extraJavaOptions=-XX:+UseCompressedOops " / --conf "spark.sql.parquet.compression.codec=snappy" / ./target/X-1.0.jar "$@"

Donde log4j.properties es un archivo de proyecto dentro de la carpeta src/main/resources/config .

Puedo ver en la consola:

log4j: Trying to find [config/log4j.properties] using context classloader org.apache.spark.util.MutableURLClassLoader@86be70a. log4j: Using URL [jar:file:/Volumes/Data/tom/www/X/datahub/djobi/./target/X-1.0.jar!/config/log4j.properties] for automatic log4j configuration. log4j: Reading configuration from URL jar:file:/Volumes/Data/tom/www/X/datahub/djobi/./target/X-1.0.jar!/config/log4j.properties log4j: Parsing for [root] with value=[WARN, console].

Por lo tanto, el archivo está bien tomado en cuenta.

Pero realmente debe confiar en los registros agregados de YARN o en la IU del historial de Spark.


Las opciones anteriores de especificar log4j.properties utilizando spark.executor.extraJavaOptions, spark.driver.extraJavaOptions solo registrarían localmente y también las log4.properties deberían estar presentes localmente en cada nodo.

Como se especifica en la https://spark.apache.org/docs/1.2.1/running-on-yarn.html documentación, también puede cargar log4j.properties junto con su aplicación mediante la opción --files. Esto haría el registro agregado de hilo en HDFS y puede acceder al registro usando el comando

yarn logs -applicationId <application id>


[Editado para evitar confusiones]

Parece que deberá agregar los argumentos de JVM utilizados al iniciar sus tareas / trabajos.

Intenta editar conf/spark-defaults.conf como se describe aquí

spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j.properties

Alternativamente, intente editar conf/spark-env.sh como se describe aquí para agregar el mismo argumento JVM, aunque las entradas en conf / spark-defaults.conf deberían funcionar.

Si todavía no está disfrutando, puede pasar explícitamente la ubicación de su archivo log4j.properties en la línea de comando junto con su spark-submit como esta si el archivo está dentro de su archivo JAR y en el directorio raíz de su classpath

spark-submit --class sparky.MyApp --master spark://my.host.com:7077 --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" myapp.jar

Si el archivo no está en su classpath, use el file: prefix y full path como este

spark-submit ... --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j-executor.properties" ...