2015-05-22 11 views
28

Ich bin sehr neu zu funken und ich möchte nur Schritt für Schritt lernen, wie man eine Funkenanwendung lokal debuggt? Könnte irgendjemand bitte die notwendigen Schritte beschreiben, um dies zu tun?Wie kann ich Funkenanwendung lokal debuggen?

Ich kann die SimpleApp auf der Spark-Website lokal von der Befehlszeile ausführen, aber ich muss nur den Code durchlaufen und sehen, wie es funktioniert. Jede Hilfe wird sehr geschätzt. Vielen Dank.

+0

ich zu erreichen Wissen Sie nicht wirklich, was Sie unter "Debuggen lernen" verstehen. In dieser Anleitung erfahren Sie, wie Sie Spark in IntelliJide https://docs.sigmoidanalytics.com/index.php/Step_by_Step_instructions_on_how_to_build_Spark_App_with_IntelliJ_IDEA lokal einrichten. – abalcerek

+1

Ich meine "wie kann ich durch die SimpleApp-Anwendung auf der Spark-Website gehen. Es gibt die SimpleApp.java-Datei und die pom.xml (wie auf der Spark-Website codiert). Wie kann ich Intellij IDE verwenden, um Zeile für Zeile Durch den Code in SimpleApp.java und sehen, was jede Zeile tatsächlich tut? Ich möchte in der Lage sein, dies zu tun, ohne den Auftrag an einen Cluster zu senden. Ich möchte nur den Code auf meinem Laptop lokal. Der von Ihnen angegebene Link gibt Die Schritte zum Erstellen der Spark App mit IntelliJ IDEA Wie wäre es, den Code Zeile für Zeile durchzugehen? Jede Hilfe wird sehr geschätzt. Danke. – eugenerory

+0

Ich weiß nicht über Scala, aber zumindest in Java können Sie Standard IDEA Debugger (im lokalen Modus Eine Sache, die Sie sich erinnern müssen, wenn Sie große Sammlung haben, müssen Sie durch alle Elemente gehen. – abalcerek

Antwort

7

Die Spark-Shell einschalten. Dies ist direkt aus dem Spark documentation:

./bin/spark-shell --master local[2] 

Sie werden auch die Spark-Shell als REPL bezeichnet sehen. Es ist bei weitem der beste Weg, um Spark zu lernen. Ich verbringe 80% meiner Zeit in der Spark-Shell und die anderen 20% übersetzen den Code in meine Anwendung.

+2

Was ist, wenn die Anwendung in Java geschrieben wird? – MFARID

+0

Die Scala Spark-Shell kann Java-Gläser laden, dann können Sie Ihre a pp und oder Methoden von Scala. –

+0

Dies ist nicht sehr nützlich, wenn Sie eine (größere) Funktion erstellen, die Sie ständig ändern und die Sie in der Shell testen müssen. Sie müssen diese Funktion jedes Mal erneut importieren, nachdem Sie sie verbessert haben. Aber das erfordert das Stoppen und Starten der Shell (jedes Mal!), Was keine schnelle Art ist, Code zu erstellen.Das OP bittet um (python) ipdb-ähnliche Funktionalität (offensichtlich nur im lokalen Modus nützlich), die anscheinend nicht existiert. –

7

Übergeben Sie einfach Java-Optionen, um den Debug-Port zu öffnen. Hier ist schöner Artikel Adressieren Ihre Frage - http://danosipov.com/?p=779 Ich verwende es wie

$ SPARK_JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 spark-shell 

(ja, SPARK_JAVA_OPTS ist veraltet, aber es funktioniert gut)

+3

Ich bin auch auf den Artikel gestoßen, den du erwähnt hast, aber der SPARK_JAVA_OPTS funktionierte bei mir nicht in einer solchen Form. Ich musste es ändern und was war es für mich war: Export SPARK_JAVA_OPTS = -agentlib: jdwp = Transport = dt_socket, Server = y, Adresse = 5005, suspend = y, onuncaught = n' –

7

Als David Griffin erwähnt, spark-shell verwendet, kann sehr hilfreich sein, . Ich finde jedoch, dass das eigentliche lokale Debugging, das Setzen von Breakpoints, das Untersuchen von Variablen usw. unerlässlich ist. Hier ist, wie ich es mit IntelliJ mache.

Stellen Sie zuerst sicher, dass Sie Ihre Funkenanwendung lokal unter Verwendung von spark-submit, z. so etwas wie:

spark-submit --name MyApp --class MyMainClass --master local[2] myapplication.jar 

Dann informieren Sie Ihren lokalen Funken Fahrer anzuhalten und für eine Verbindung von einem Debugger warten, wenn er startet, durch Hinzufügen einer Option wie folgt aus:

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 

wo agentlib:jdwp ist die Java Debug Wire Protocol Option durch eine durch Kommata getrennte Liste von Unteroptionen gefolgt:

  • transport definiert das Verbindungsprotokoll zwischen Debugger und Debuggee verwendet - eithe r Socket oder "shared memory" - Sie wollen fast immer socket (dt_socket) außer ich glaube in einigen Fällen auf Microsoft Windows
  • ob dieser Prozess sollte der Server sein, wenn mit dem Debugger (oder umgekehrt, der Client) - - Sie benötigen immer einen Server und einen Client. In diesem Fall sind wir der Server und warten auf eine Verbindung vom Debugger
  • suspend, ob die Ausführung angehalten werden soll, bis ein Debugger erfolgreich verbunden ist. Wir schalten das ein, damit der Treiber nicht startet, bis der Debugger
  • address hier verbindet, das ist der Port, auf dem (für eingehende Debugger-Verbindungsanforderungen) überwacht wird.Sie können es auf jedem verfügbaren Port eingestellt (Sie müssen nur sicherstellen, dass der Debugger auf demselben Port verbinden konfiguriert ist)

So, jetzt Ihr spark-submit Kommandozeile etwas aussehen sollte:

spark-submit --name MyApp --class MyMainClass --master local[2] --conf spark.driver.extraJavaOptions=agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 

Nun, wenn Sie die oben ausführen, sollten Sie so etwas wie

Listening for transport dt_socket at address: 5005 

und Ihre Funken Anwendung wartet der Debugger anhängen sehen.

Als nächstes öffnen Sie das IntelliJ-Projekt mit Ihrer Spark-Anwendung, und öffnen Sie dann "Ausführen -> Konfigurationen bearbeiten ..." Klicken Sie dann auf das "+", um eine neue Run/Debug-Konfiguration hinzuzufügen, und wählen Sie "Remote". Gib ihm einen Namen, z.B. "SparkLocal", wählen Sie "Socket" für den Transport, "Attach" für den Debugger-Modus und geben Sie "localhost" für Host und den oben für Port verwendeten Port ein, in diesem Fall "5005". Klicken Sie auf "OK", um zu speichern.

In meiner Version von IntelliJ gibt es Vorschläge für die Debug-Befehlszeile für den debugged Prozess, und es verwendet "suspend = n" - wir ignorieren das und verwenden "suspend = y" (wie oben) weil wir wollen, dass die Anwendung wartet, bis wir uns verbinden, um zu beginnen.

Jetzt sollten Sie bereit sein zu debuggen. Starten Sie einfach spark mit dem obigen Befehl, wählen Sie dann die IntelliJ-Run-Konfiguration, die Sie gerade erstellt haben und klicken Sie auf Debug. IntelliJ sollte eine Verbindung zu Ihrer Spark-Anwendung herstellen, die nun gestartet werden sollte. Sie können Breakpoints setzen, Variablen überprüfen usw.

+0

Bearbeitet, um Tippfehler durch Hinzufügen zu beheben " - "vor" agentlib ", wie in anderen Antworten erwähnt –

2

@Jason Evans 'Antwort hat bei mir nicht funktioniert. Aber

--conf spark.driver.extraJavaOptions=-Xrunjdwp:transport=dt_socket,server=y,address=8086,suspend=n 

arbeitete

+0

Ja, es war ein" - "fehlt vor" agentlib "wie von @ryan hingewiesen, jetzt behoben –

0

nur eine kleine Änderung für @ Jason Evans Antwort benötigt wird. Es braucht ein '-' vor dem String "agentlib ...."

--conf spark.driver.extraJavaOptions=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 

Sie auch die Möglichkeit nutzen könnten "--driver-java-Optionen" den gleichen Zweck

--driver-java-options -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 
+0

Ja, Sie sind richtig @ryan über das fehlende" - ", Danke! –