2016-06-30 3 views
0

Ich habe einige Logik in Spark implementiert. Die Ausführung dieser Logik hängt von dem Parameter ab, der an den Java-Code übergeben wird. In meiner Hauptmethode habe ich einen Schalterfall. Wenn ich einen korrekten Parameter übergebe, funktioniert alles einwandfrei. Wenn ich einen zufälligen Parameter übergebe, der nicht in meinem Switch-Fall ist, erhalte ich Spark Exception. Beendet mit fehlgeschlagenem Status.Spark Submit im Cluster-Modus fehlgeschlagen, wenn die Hauptmethode nichts unternimmt

Wenn ich den gleichen Code im Client-Modus ausführen, wirft es keine Ausnahme mit falschen Parameter, die ich denke, ist das richtige Verhalten.

Ich erstelle nur Kontext, wenn mein Parameter korrekt ist. Also, wenn ich eine leere Hauptmethode im Cluster-Modus gebe, bekomme ich eine Ausnahme.

Kann mir jemand erklären, wie das geht. Wie kann ich diese Ausnahme vermeiden?

public class MyClass{ 
private JavaSparkContext context = null; 
private HiveContext hiveContext = null; 
public static void main(String[] args) { 


    MyClass obj = new MyClass(); 
    obj.startProcessing(args);  
} 

startProcessing-Methode einfach enthält einen Schalter Fall.

Dank

Stacktrace:

Exception in thread "main" org.apache.spark.SparkException: Application application_1466638963111_3824 finished with failed status 
    at org.apache.spark.deploy.yarn.Client.run(Client.scala:1036) 
    at org.apache.spark.deploy.yarn.Client$.main(Client.scala:1083) 
    at org.apache.spark.deploy.yarn.Client.main(Client.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:731) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:181) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:206) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:121) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

Antwort

3

Wenn Sie die Anwendung in "Client-Modus laufen, Skript, das Sie Ihre Anwendung ausführen verwenden, um (was ich denke, ist bin/Funken einreichen) direkt Starten Sie Ihre Hauptklasse. Ihre Main-Klasse muss Spark-Kontexte erstellen und dieser Spark-Kontext stellt eine Verbindung zum Spark-Cluster- oder Cluster-Manager her, wenn Sie einen wie Mesos oder Yarn verwenden. In diesem Fall ist es in Ordnung, wenn Sie keinen Spark-Kontext erstellen. Deine Hauptklasse mache einfach nichts und gehe.

Im Cluster-Modus führt Spark Ihre Main-Klasse nicht direkt aus, sondern erstellt einen Client, der eine Übertragungsanforderung erstellt und diese Anforderung an Cluster sendet. Diese Übermittlungsanforderung hat Ihren Hauptklassennamen als Parameter. Wenn Cluster diese Anfrage erhält, startet sie Ihre Main-Klasse. Der Client wartet zu diesem Zeitpunkt auf die Antwort des Clusters, dass der Spark-Kontext erfolgreich erstellt wurde und der Client Informationen zum erstellten Kontext abrufen muss.

Wenn Sie jedoch keinen Kontext erstellen, kann der Client keine Verbindung herstellen, und cliend erhält keine Antwort, dass der Kontext erfolgreich erstellt wurde, und löst eine Ausnahme aus.

Sie können auch

--verbose

Flagge zu Ihrem Start-Skript hinzufügen, und Sie werden, dass im Client-Modus sehen es startet Ihre Hauptklasse direkt und im Cluster-Modus startet es unterschiedliche Haupt Klasse.

+0

Vielen Dank. Ich habe jetzt den Grund verstanden. Danke für die Erklärung so ausführlich. – user1544460

Verwandte Themen