2015-02-11 11 views
24

Sto creando un'applicazione Apache Streaming Streaming e non riesco a collegarlo a un file sul filesystem locale quando lo si esegue su YARN. Come può ottenere questo?Come accedere utilizzando log4j al file system locale all'interno di un'applicazione Spark che viene eseguita su YARN?

Ho impostato log4.properties file in modo che possa scrivere su un file di log nella /tmp directory del file system locale (illustrato di seguito in parte):

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 

Quando eseguo la mia applicazione Spark locale utilizzando il seguente comando:

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

funziona benissimo e posso vedere che i messaggi di log vengono scritti /tmp/application.log sul mio file system locale.

Ma quando eseguo la stessa applicazione tramite YARN, ad es.

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 

non riesco a vedere alcun /tmp/application.log sul file system locale della macchina che corre filato.

Cosa mi manca.

+0

Ho appena incollato la sezione di log4j.properties e l'ho eseguita localmente in modo simile alla tua ma non sta creando alcun file di registro per il mio/tmp. mi sto perdendo qualcosa? – user1870400

+1

Ho trovato questo post utile- https://stackoverflow.com/questions/27781187/how-to-stop-messages-displaying-on-spark-console –

risposta

17

[A cura di evitare confusione]

Sembra che avrete bisogno di aggiungere agli argomenti JVM utilizzate al momento del lancio le attività/posti di lavoro.

editing Prova conf/spark-defaults.conf come described here

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 

In alternativa provate modifica conf/spark-env.sh come described here per aggiungere lo stesso argomento JVM, anche se le voci in conf/scintilla defaults.conf dovrebbero funzionare.

Se non si ha ancora alcuna gioia, è possibile passare esplicitamente il percorso del file log4j.properties sulla riga di comando insieme al proprio spark-submit in questo modo se il file è contenuto nel file JAR e nella directory principale di classpath

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

Se il file non è sul classpath utilizzare il prefisso file: e il percorso completo come questo

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

Sono un po 'confuso. Il mio file log4j.properties è impacchettato nel file JAR. La mia applicazione è un progetto Maven e sto creando un file JAR singolo, grande e autonomo che contiene anche il file log4j.properties. Funziona bene quando eseguo Spark localmente. È questo (mettere log4j.properties in JAR) non è possibile quando eseguo Spark sul cluster YARN? –

+2

Sì, dovrebbe essere possibile. Sto cercando di aiutare a semplificare il problema eliminando la configurazione che stai utilizzando. Non sono un esperto in Spark. Ho un registro stand-alone su un host Windows. – Brad

+0

@Emre Ho avuto un gioco con le varie impostazioni menzionate nella mia risposta, che mi ha portato a riscriverlo. Ho ottenuto il log lavorando modificando 'spark-defaults.conf', e poi ho anche funzionato usando' spark-submit --conf'. L'uno o l'altro dovrebbe funzionare (non dovresti averne bisogno entrambi) – Brad

1

in alternativa, è possibile utilizzare PropertyConfigu rator di log4j per definire le proprietà del registro personalizzato.

Es.

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."); 
    } 
} 

Il file di proprietà avrà i seguenti oggetti di scena,

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: aggiornamento link alla documentazione log4j. Spark utilizza log4j 2, non v1.2

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

+0

Non so se questo funzionerà sia su executor che su driver. Nel codice precedente, sarà probabilmente configurato solo per il driver. – panther

6

Le opzioni di cui sopra per specificare le log4j.properties utilizzando spark.executor.extraJavaOptions, spark.driver.extraJavaOptions avrebbero log solo a livello locale e anche le log4.properties dovrebbero essere presenti localmente su ogni nodo.

Come specificato nella documentazione https://spark.apache.org/docs/1.2.1/running-on-yarn.html, in alternativa è possibile caricare log4j.properties insieme all'applicazione utilizzando l'opzione --files. Questo avrebbe fatto la registrazione di filati di aggregazione su HDFS ed è possibile accedere al registro utilizzando il comando

yarn logs -applicationId <application id> 
+0

avete un esempio di un file log4j.properties per accedere a HDFS? – Irene

+1

@Irene Questa è l'unica differenza con il file log4.properties altrimenti normale. ** log4j.appender.file_appender.File = $ {spark.yarn.app.container.log.dir} /spark.log** – Chandra

1

In te file di log4j.properties, si dovrebbe anche modificare il log4j.rootCategoryINFO,console-INFO,file.

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

Ehi @Vojtech questo dipenderà dalla versione che sei per il logger ... prendi un guarda https://logging.apache.org/log4j/1.2/manual.html –

2

L'invio di lavoro come questo:

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 "[email protected]" 

Dove log4j.properties è un file di progetto all'interno della cartella src/main/resources/config.

posso vedere nella console:

log4j: Trying to find [config/log4j.properties] using context classloader [email protected] 

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

Quindi il file viene preso in considerazione bene.

Ma si dovrebbe davvero fare affidamento sui log aggregati YARN o sull'interfaccia utente di Spark history.

Problemi correlati