2016-03-22 8 views
2

Ich teste meine Spark-Streaming-Anwendung, und ich habe mehrere Funktionen in meinem Code: - einige von ihnen arbeiten auf einem DStream [RDD [XXX]], einige von ihnen auf RDD XXX] (nachdem ich DStream.foreRADD gemacht habe).Spark-Streaming-Anwendung und kafka log4j Appender Ausgabe

Ich benutze Kafka log4j Appender, um Geschäftsfälle zu protokollieren, die innerhalb meiner Funktionen auftreten, die auf beiden DStream [RDD] & RDD es Selbst arbeiten.

Aber Daten werden nur dann an Kafka angehängt, wenn von Funktionen, die auf RDD funktionieren -> es funktioniert nicht, wenn ich Daten an kafka von meinen Funktionen, die auf DStream arbeiten, anhängen will.

Kennt jemand Grund zu diesem Verhalten?

Ich arbeite an einer einzigen virtuellen Maschine, wo ich Spark & Kafka habe. Ich reiche Anwendungen ein, die Spark submit verwenden.

EDITED

Eigentlich habe ich das Teil des Problems herausgefunden. Daten werden nur von dem Teil des Codes, der in meiner Hauptfunktion liegt, an Kafka angehängt. All der Code, der außerhalb meines Hauptbereichs liegt, schreibt keine Daten in kafka.

Im Haupt erklärte ich den Logger wie folgt aus:

val kafkaLogger = org.apache.log4j.LogManager.getLogger("kafkaLogger") 

Während außerhalb meiner Haupt, ich mag es zu erklären hatte:

@transient lazy val kafkaLogger = org.apache.log4j.LogManager.getLogger("kafkaLogger") 

, um zu vermeiden Ausgaben Serialisierung.

Der Grund könnte hinter JVM Serialisierung Konzept sein, oder einfach, weil Arbeiter sehen nicht die log4j Konfigurationsdatei (aber meine log4j-Datei ist in meinem Quellcode, in Ressourcenordner)

Edited 2

Ich habe versucht, log4j Datei an Executoren zu senden, aber nicht funktioniert. Ich habe versucht:

  • log4j-Datei in --files Befehl senden Funken einreichen

  • Einstellung: --conf "spark.executor.extraJavaOptions =-Dlog4j.configuration=file:/home/vagrant/log4j.properties" in

  • Einstellung log4j.properties Datei in --driver-Klasse Funken einreichen -Pfad der Funke senden ...

Keine dieser Option funktionierte.

Jeder hat die Lösung? Ich sehe keine Fehler in meinem Fehlerprotokoll ..

Danke

+0

Sie sollten auf jeden Fall etwas Code veröffentlichen, damit wir helfen können. –

+0

@YuvalItzchakov, Ich habe gerade die Frage bearbeitet –

Antwort

0

Ich glaube, Sie sind close..first Sie alle sicherstellen möchten, die Dateien in den Verzeichnis exportiert werden (nicht CLASSPATH) auf allen Knoten mit --files Flag. Und dann möchten Sie diese Dateien auf die extracClassPath-Option von Executoren und Treibern verweisen.Ich habe den folgenden Befehl angehängt, hoffe es hilft. Der Schlüssel besteht darin zu verstehen, dass nach dem Export der Dateien alle Dateien auf dem Knoten nur über den Dateinamen des Arbeitsverzeichnisses (und nicht über den URL-Pfad) aufgerufen werden können.

Hinweis: Die log4j-Datei im Ressourcenordner wird nicht funktionieren. (zumindest, als ich es versucht hatte, tat es nicht.)

sudo -u hdfs spark-submit --class "SampleAppMain" --master yarn --deploy-mode cluster --verbose --files file:///path/to/custom-log4j.properties,hdfs:///path/to/jar/kafka-log4j-appender-0.9.0.0.jar --conf "spark.driver.extraClassPath=kafka-log4j-appender-0.9.0.0.jar" --conf "spark.executor.extraClassPath=kafka-log4j-appender-0.9.0.0.jar" --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=custom-log4j.properties" --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=custom-log4j.properties" /path/to/your/jar/SampleApp-assembly-1.0.jar 
Verwandte Themen