web-dev-qa-db-fra.com

Comment se connecter à l'aide de log4j au système de fichiers local dans une application Spark qui s'exécute sur YARN?

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.

31
Emre Sevinç

[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" ...
24
Brad

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>
8
Chandra

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.

3
Thomas Decaux

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

Réf.: http://logging.Apache.org/log4j/2.x/

1
Ashwin Giridharan

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
1
Bing