Log4j2 muestra registros en un bucle “foreach” dentro del registro del ejecutor, pero no en el método “map” en el registro del ejecutor.
Estoy usando Spark 2.3.0.
Cuando uso foreach
dentro de un dataframe y registro mensajes, puedo ver los registros en el registro del ejecutor. Pero, ¿por qué no imprime los registros en el método map
?
val df = Seq((0)).toDF("a")
df.foreachPartition { iterator =>
{
iterator.map { row =>
{
val LOGGER = LogManager.getLogger(getClass.getName)
Configurator.setRootLevel(Level.INFO);
LOGGER.info("Probando el registro en el ejecutor")
}
}
}
} //No imprime en el registro del ejecutor
df.foreachPartition { iterator =>
{
iterator.foreach { row =>
{
val LOGGER = LogManager.getLogger(getClass.getName)
Configurator.setRootLevel(Level.INFO);
LOGGER.info("Probando el registro en el ejecutor")
}
}
}
} //Imprime registros del ejecutor
¿Cuál es la razón de esto y hay alguna manera de lograrlo (estoy usando Log4j2 con el archivo log42.properties
)?
davy.ai
La razón por la que los registros no se imprimen en el método
map
es quemap
es una operación de transformación y se ejecuta de forma perezosa. Cuando se llama amap
, devuelve un nuevo dataframe sin activar ninguna acción. Por lo tanto, el código dentro del métodomap
no se ejecuta realmente hasta que se llama a una acción en el dataframe.En cambio, el método
foreach
es una acción y se ejecuta de inmediato. Por lo tanto, los registros dentro del métodoforeach
se pueden imprimir en el registro del ejecutor.Para lograr el registro en el método
map
, puedes usar el métodoforeach
en lugar demap
para activar la acción. Alternativamente, puedes convertir el dataframe en unRDD
y luego utilizar la transformaciónmap
en elRDD
, seguida de la acciónforeach
. Esto asegurará que el código dentro del métodomap
se ejecute y los registros se impriman en el registro del ejecutor.Por ejemplo:
Ten en cuenta que si decides utilizar
foreach
dentro de la transformaciónmap
, no garantiza que los registros se impriman en orden, ya queforeach
se ejecuta en paralelo en múltiples particiones.