Je construis un Apache Spark Application en streaming et ne peut pas le consigner dans un fichier sur le système de fichiers local lorsqu'il est exécuté sur YARN. Comment peut-on y parvenir?
J'ai mis log4.properties
fichier afin qu’il puisse écrire avec succès dans un fichier journal dans /tmp
répertoire sur le système de fichiers local (indiqué ci-dessous partiellement):
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
Lorsque j'exécute mon application Spark localement à l'aide de la commande suivante:
spark-submit --class myModule.myClass --master local[2] --deploy-mode client myApp.jar
Il fonctionne bien et je peux voir que les messages du journal sont écrits dans /tmp/application.log
sur mon système de fichiers local.
Mais lorsque je lance la même application via YARN, par exemple.
spark-submit --class myModule.myClass --master yarn-client --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar
ou
spark-submit --class myModule.myClass --master yarn-cluster --name "myModule" --total-executor-cores 1 --executor-memory 1g myApp.jar
Je ne vois aucune /tmp/application.log
sur le système de fichiers local de la machine qui exécute YARN.
Qu'est-ce que je rate.
[Edité pour éviter la confusion]
Il semble que vous deviez ajouter aux arguments de la machine virtuelle Java utilisés lors du lancement de vos tâches/travaux.
Essayez de modifier conf/spark-defaults.conf
comme décrit ici
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
Sinon, essayez de modifier conf/spark-env.sh
as décrit ici pour ajouter le même argument JVM, bien que les entrées de conf/spark-defaults.conf devraient fonctionner.
Si vous n'obtenez toujours pas de joie, vous pouvez explicitement indiquer l'emplacement de votre fichier log4j.properties sur la ligne de commande avec votre spark-submit
comme ceci si le fichier est contenu dans votre fichier JAR et dans le répertoire racine de votre chemin de classe
spark-submit --class sparky.MyApp --master spark://my.Host.com:7077 --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" myapp.jar
Si le fichier ne se trouve pas sur votre chemin de classe, utilisez le file:
préfixe et chemin complet comme celui-ci
spark-submit ... --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/apps/spark-1.2.0/conf/log4j-executor.properties" ...
Les options ci-dessus consistant à spécifier le fichier log4j.properties à l'aide de spark.executor.extraJavaOptions, spark.driver.extraJavaOptions l'enregistrent uniquement localement et les propriétés log4.properties doivent également être présentes localement sur chaque nœud.
Comme spécifié dans la documentation https://spark.Apache.org/docs/1.2.1/running-on-yarn.html , vous pouvez également télécharger log4j.properties avec votre application à l'aide de - option de fichiers. Cela ferait la journalisation des agrégats de fils sur HDFS et vous pouvez accéder au journal en utilisant la commande
yarn logs -applicationId <application id>
1) Pour déboguer comment Spark sur YARN interprète vos paramètres log4j, utilisez l'indicateur log4j.debug
.
2) Spark créera 2 types de conteneurs YARN, le pilote et le travailleur. Vous souhaitez donc partager un fichier à partir duquel vous envoyez la demande avec tous les conteneurs (vous ne pouvez pas utiliser un fichier à l'intérieur du fichier). JAR, puisqu'il ne s'agit pas vraiment du fichier JAR), vous devez donc utiliser la directive --files
Spark submit (elle partagera le fichier avec tous les travailleurs).
Comme ça:
spark-submit
--class com.X.datahub.djobi.Djobi \
--files "./log4j.properties" \
--driver-Java-options "-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.debug=true -Dlog4j.configuration=log4j.properties " \
./target/X-1.0.jar "$@"
Où log4j.properties est un fichier de projet dans le dossier src/main/resources/config
.
Je peux voir dans la console:
log4j: Trying to find [config/log4j.properties] using context
classloader org.Apache.spark.util.MutableURLClassLoader@5bb21b69.
log4j: Using URL [jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL jar:file:/home/hdfs/djobi/latest/lib/djobi-1.0.jar!/config/log4j.properties
Donc, le fichier est pris en compte, vous pouvez vérifier sur Spark webUI aussi.
Alternativement, vous pouvez utiliser PropertyConfigurator de log4j pour définir vos propriétés de journal personnalisées.
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.");
}
}
Votre fichier de propriétés doit avoir les accessoires suivants,
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
EDIT: Mise à jour du lien vers log4j docs. Spark utilise log4j 2, pas v1.2
Dans votre fichier log4j.properties, vous devez également modifier le fichier log4j.rootCategory
de INFO,console
à INFO,file
.
log4j.rootCategory=INFO, console
log4j.rootCategory=INFO,file