Spring-Boot-Java-Anwendung kann nicht an Spark-Cluster gesendet werden

8

Ich habe eine Webanwendung mit Spring Boot entwickelt, die Apache Spark zum Abfragen von Daten aus verschiedenen Datenquellen (wie Oracle) verwendet. Zu Beginn hatte ich geplant, die Anwendung auszuführen, ohne sie mit dem Spark-Submit-Skript zu senden, aber es sieht so aus, als ob ich keine Verbindung zum Master-Cluster herstellen kann, ohne ein Jar zu senden. Ich habe erfolgreich ein Uber-Jar generiert, das alle Abhängigkeiten und Sub-Projekte enthält, die ich benutze, aber es scheint so Spark mag Spring-Boot-Anwendungen nicht. Wenn ich versuche, die App zu senden, zeigt Spark den folgenden Fehler:

%Vor%

Verwenden Sie das standardmäßige log4j-Profil von Spark: org / apache / spark / log4j-defaults.properties

Ich habe versucht, die slf4j-log4j12 Abhängigkeit in der Pom-Datei auszuschließen, aber ich bekomme immer noch den gleichen Fehler.

Die Pom-Datei enthält die folgende Konfiguration:

%Vor%

Gibt es eine Möglichkeit, eine Spring-Boot-Anwendung an den Cluster zu senden? Sollte ich einen anderen Projekttyp verwenden, der berücksichtigt, dass ich eine RESTful-API bereitstellen muss? Gibt es eine Möglichkeit, sich mit dem Funkencluster zu verbinden, ohne das .jar zu senden?

Vielen Dank im Voraus für Ihre Hilfe.

    
Stefan S 16.07.2015, 22:26
quelle

3 Antworten

4

Ich hatte ein ähnliches Problem. Um es zu lösen, versuchen Sie, Spring Boot Logging mit folgendem Ausschluss zu entfernen:

%Vor%

Wenn beim Initialisieren des Servlets immer noch ein Fehler auftritt

  

java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName () Ljava / lang / String;

Versuchen Sie dann, die 1.2.1.RELEASE-Version des Starter-Parents zu verwenden, da dies aufgrund der Servlet-API-Version, die vom Spark-Cluster verwendet wird, verursacht wird.

    
rojasmi 20.07.2015, 16:18
quelle
1

Beim Build-Time-Spring-Boot wird überprüft, ob Sie eine bestimmte Logging-Implementierung in Ihr Build eingefügt haben. Wenn dies nicht der Fall ist, wird Logback standardmäßig verwendet. Anscheinend fügt Spark beim Ausführen der Anwendung Log4J dem Klassenpfad hinzu, was wiederum einen Laufzeitfehler verursacht, da Spring Boot nun zwei Logger-Implementierungen auf dem Klassenpfad findet: den einen, der zur Build-Zeit (Logback) eingeschlossen wurde, und den einen Spark zur Laufzeit hinzufügen (Log4J).

Wenn Spark eine Möglichkeit bietet, die Aufnahme von Log4J zur Laufzeit zu unterdrücken, könnten Sie das tun und Spring Booting standardmäßig in Logback lassen.

Wenn Spark Log4J für Sie erzwingt, dann wäre die Lösung, Log4J (nicht Logback) explizit in Ihren Build aufzunehmen, damit Spring Boot eine Build-Zeit "sieht" und somit Logback nicht einschließt.

>

BEARBEITEN: Ich hätte meine Annahme überprüfen sollen, indem ich mir die Spring Boot-Dokumente angeschaut habe. Sie müssen Log4J explizit ausschließen. Siehe Spring Boot-Logging-Dokumente .

    
RichW 16.07.2015 22:55
quelle
0

Spark unterstützt nur log4j. Um zu erzwingen, dass Spring-Boot log4j anstelle von Logback standardmäßig verwendet, wenden Sie diese Prozedur aus der Spring-Boot-Referenzdokumentation , aber stellen Sie sicher, dass Sie log4j2 in log4j ändern und ihm eine Version geben, z 1.2.17. Sie müssen außerdem eine Datei log4j.properties in src/main/resources einfügen. Sie können log4j.properties.template aus Sparks / conf-Verzeichnis kopieren und in log4j.properties umbenennen.

    
Daniel Nitzan 27.09.2016 14:15
quelle

Tags und Links