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
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" ...