Freigeben über


Verwenden des Azure Toolkits für IntelliJ zum Remotedebugging von Apache Spark-Anwendungen in HDInsight über VPN

Wir empfehlen das Remotedebuggen von Apache Spark-Anwendungen über SSH. Anweisungen finden Sie unter Remotedebugging von Apache Spark-Anwendungen auf einem HDInsight-Cluster mit Azure Toolkit für IntelliJ über SSH.

Dieser Artikel enthält schrittweise Anleitungen zur Verwendung der HDInsight-Tools im Azure Toolkit für IntelliJ zum Übermitteln eines Spark-Auftrags an einen HDInsight Spark-Cluster und anschließendes Remotedebugging von Ihrem Desktopcomputer. Zum Ausführen dieser Aufgaben müssen Sie die folgenden allgemeinen Schritte ausführen:

  1. Erstellen Sie ein virtuelles Azure-Netzwerk vom Typ „Site-to-Site“ oder „Point-to-Site“. Bei den Schritten in diesem Dokument wird davon ausgegangen, dass Sie ein Standort-zu-Standort-Netzwerk verwenden.
  2. Erstellen Sie einen Spark-Cluster in HDInsight, der Teil des virtuellen Standortnetzwerks ist.
  3. Überprüfen Sie die Konnektivität zwischen dem Clusterkopfknoten und dem Desktop.
  4. Erstellen Sie eine Skala-Anwendung in IntelliJ IDEA, und konfigurieren Sie sie dann für das Remotedebugging.
  5. Führen Sie die Anwendung aus, und debuggen Sie sie.

Voraussetzungen

  • Ein Azure-Abonnement.
  • Ein Apache Spark-Cluster in HDInsight. Eine Anleitung finden Sie unter Erstellen von Apache Spark-Clustern in Azure HDInsight.
  • Oracle Java Development Kit. Sie können es von der Oracle-Website installieren.
  • IntelliJ IDEA. In diesem Artikel wird Version 2017.1 verwendet. Sie können diese IDE von der JetBrains-Website herunterladen und installieren.
  • HDInsight-Werkzeuge im Azure-Toolkit für IntelliJ. HDInsight-Tools für IntelliJ sind als Teil des Azure Toolkit für IntelliJ verfügbar. Anweisungen zum Installieren von Azure Toolkit finden Sie unter Installieren des Azure Toolkits für IntelliJ.
  • Melden Sie sich bei Ihrem Azure-Abonnement von IntelliJ IDEA an. Befolgen Sie die Anweisungen unter Verwenden des Azure Toolkit für IntelliJ zum Erstellen von Apache Spark-Anwendungen für einen HDInsight-Cluster.
  • Ausnahmeumgehung. Beim Ausführen der Spark Scala-Anwendung für das Remotedebugging auf einem Windows-Computer wird möglicherweise eine Ausnahme angezeigt. Diese Ausnahme wird in SPARK-2356 erläutert und tritt aufgrund einer fehlenden WinUtils.exe Datei in Windows auf. Um diesen Fehler zu umgehen, müssen Sie Winutils.exe an einen Speicherort wie C:\WinUtils\bin herunterladen. Fügen Sie eine HADOOP_HOME Umgebungsvariable hinzu, und legen Sie dann den Wert der Variablen auf C\WinUtils fest.

Schritt 1: Erstellen eines virtuellen Azure-Netzwerks

Folgen Sie den Anweisungen aus den folgenden Links, um ein virtuelles Azure-Netzwerk zu erstellen, und überprüfen Sie dann die Verbindung zwischen Ihrem Desktopcomputer und dem virtuellen Netzwerk:

Schritt 2: Erstellen eines HDInsight Spark-Clusters

Es wird empfohlen, auch einen Apache Spark-Cluster in Azure HDInsight zu erstellen, der Teil des von Ihnen erstellten virtuellen Azure-Netzwerks ist. Verwenden Sie die Informationen, die in Linux-basierte Cluster in HDInsight erstellen verfügbar sind. Wählen Sie als Teil der optionalen Konfiguration das virtuelle Azure-Netzwerk aus, das Sie im vorherigen Schritt erstellt haben.

Schritt 3: Überprüfen der Konnektivität zwischen dem Clusterkopfknoten und dem Desktop

  1. Rufen Sie die IP-Adresse des Hauptknotens ab. Öffnen Sie die Ambari-Benutzeroberfläche für den Cluster. Klicken Sie auf dem Clusterblatt auf Dashboard.

    Wählen Sie

  2. Wählen Sie auf der Ambari-Benutzeroberfläche "Hosts" aus.

    Wählen Sie Hosts in Apache Ambari aus.

  3. Eine Liste mit Hauptknoten, Workerknoten und Zookeeper-Knoten wird angezeigt. Die Kopfknoten weisen ein hn*-Präfix auf. Wählen Sie den ersten Hauptknoten aus.

    Suchen Sie den Kopfknoten in Apache Ambari.

  4. Aus dem Bereich Zusammenfassung unten auf der geöffneten Seite kopieren Sie die IP-Adresse des Kopfknotens und den Hostnamen.

    Suchen Sie die IP-Adresse in Apache Ambari.

  5. Fügen Sie die IP-Adresse und den Hostnamen des Kopfknotens zur Hostdatei auf dem Computer hinzu, auf dem Sie den Spark-Auftrag ausführen und remote debuggen möchten. Auf diese Weise können Sie mit dem Kopfknoten kommunizieren, indem Sie die IP-Adresse sowie den Hostnamen verwenden.

    a) Öffnen Sie eine Editor-Datei mit erhöhten Rechten. Wählen Sie im Menü "Datei " die Option "Öffnen" aus, und suchen Sie dann den Speicherort der Hostdatei. Auf einem Windows-Computer lautet der Speicherort "C:\Windows\System32\Drivers\etc\hosts".

    b. Fügen Sie der Hostdatei die folgenden Informationen hinzu:

    # For headnode0
    192.xxx.xx.xx nitinp
    192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net
    
    # For headnode1
    192.xxx.xx.xx nitinp
    192.xxx.xx.xx nitinp.lhwwghjkpqejawpqbwcdyp3.gx.internal.cloudapp.net
    
  6. Überprüfen Sie vom Computer, den Sie mit dem virtuellen Azure-Netzwerk verbunden haben, das vom HDInsight-Cluster verwendet wird, ob Sie die Kopfknoten mithilfe der IP-Adresse und des Hostnamens pingen können.

  7. Verwenden Sie SSH, um eine Verbindung mit dem Clusterkopfknoten herzustellen, indem Sie die Anweisungen in "Herstellen einer Verbindung mit einem HDInsight-Cluster mithilfe von SSH" befolgen. Pingen Sie vom Clusterkopfknoten die IP-Adresse des Desktopcomputers. Testen Sie die Verbindung mit beiden IP-Adressen, die dem Computer zugewiesen sind:

    • Eine für die Netzwerkverbindung
    • Eines für das virtuelle Azure-Netzwerk
  8. Wiederholen Sie die Schritte für den anderen Kopfknoten.

Schritt 4: Erstellen einer Apache Spark Scala-Anwendung mithilfe von HDInsight-Tools in Azure Toolkit für IntelliJ und Konfigurieren der Anwendung für Remotedebugging

  1. Öffnen Sie IntelliJ IDEA, und erstellen Sie ein neues Projekt. Gehen Sie im Dialogfeld Neues Projekt wie folgt vor:

    Wählen Sie die neue Projektvorlage in IntelliJ IDEA aus.

    a) Wählen Sie HDInsight>Spark auf HDInsight (Scala) aus.

    b. Wählen Sie Weiteraus.

  2. Führen Sie im nächsten Dialogfeld "Neues Projekt " die folgenden Schritte aus, und wählen Sie dann "Fertig stellen" aus:

    • Geben Sie einen Projektnamen und einen Speicherort ein.

    • Wählen Sie in der Dropdownliste Project SDK (SDK für Projekt) Java 1.8 für den Spark 2.x-Cluster oder Java 1.7 für den Spark 1.x-Cluster aus.

    • In der Dropdownliste "Spark-Version " integriert der Assistent zum Erstellen von Scala-Projekten die richtige Version für das Spark SDK und das Scala SDK. Wenn Sie eine ältere Spark-Clusterversion als 2.0 verwenden, wählen Sie Spark 1.x aus. Wählen Sie andernfalls Spark 2.x aus. In diesem Beispiel wird Spark 2.0.2 (Scala 2.11.8) verwendet.

    Wählen Sie das Project SDK und die Spark-Version aus.

  3. Das Spark-Projekt erstellt automatisch ein Artefakt. Um das Artefakt anzuzeigen, gehen Sie folgendermaßen vor:

    a) Wählen Sie im Menü "Datei " die Option "Projektstruktur" aus.

    b. Klicken Sie im Dialogfeld Project Structure (Projektstruktur) auf Artifacts (Artefakte), um sich das erstellte Standardartefakt anzeigen zu lassen. Sie können auch ein eigenes Artefakt erstellen, indem Sie auf das Pluszeichen ( + ) klicken.

    IntelliJ IDEA-Artefakte erstellen die JAR-Datei.

  4. Fügen Sie Ihrem Projekt Bibliotheken hinzu. Gehen Sie wie folgt vor, um eine Bibliothek hinzuzufügen:

    a) Klicken Sie mit der rechten Maustaste auf den Projektnamen in der Projektstruktur, und wählen Sie dann " Moduleinstellungen öffnen" aus.

    b. Wählen Sie im Dialogfeld "Projektstruktur" die Option "Bibliotheken" aus, wählen Sie das (+) Symbol und dann "Von Maven" aus.

    IntelliJ IDEA Bibliothek für den Download.

    Abschnitt c. Suchen Sie im Dialogfeld " Bibliothek aus Maven Repository herunterladen " nach den folgenden Bibliotheken, und fügen Sie sie hinzu:

    • org.scalatest:scalatest_2.10:2.2.1
    • org.apache.hadoop:hadoop-azure:2.7.1
  5. Kopieren Sie yarn-site.xml und core-site.xml vom Clusterkopfknoten und fügen Sie sie dem Projekt hinzu. Verwenden Sie die folgenden Befehle, um die Dateien zu kopieren. Sie können Cygwin verwenden, um die folgenden scp Befehle auszuführen, um die Dateien von den Clusterkopfknoten zu kopieren:

    scp <ssh user name>@<headnode IP address or host name>://etc/hadoop/conf/core-site.xml .
    

    Da wir die IP-Adresse und den Hostnamen des Clusterhauptknotens für die Datei „hosts“ auf dem Desktopcomputer bereits hinzugefügt haben, können wir die scp-Befehle wie folgt verwenden:

    scp sshuser@nitinp:/etc/hadoop/conf/core-site.xml .
    scp sshuser@nitinp:/etc/hadoop/conf/yarn-site.xml .
    

    Wenn Sie diese Dateien zu Ihrem Projekt hinzufügen möchten, kopieren Sie sie in den Ordner /src in Ihrem Projektbaum, zum Beispiel <your project directory>\src.

  6. Aktualisieren Sie die core-site.xml Datei, um die folgenden Änderungen vorzunehmen:

    a) Ersetzen Sie den verschlüsselten Schlüssel. Die core-site.xml Datei enthält den verschlüsselten Schlüssel zum Speicherkonto, das dem Cluster zugeordnet ist. Ersetzen Sie in der core-site.xml Datei, die Sie dem Projekt hinzugefügt haben, den verschlüsselten Schlüssel durch den tatsächlichen Speicherschlüssel, der dem Standardspeicherkonto zugeordnet ist. Weitere Informationen finden Sie unter Verwalten von Speicherkonto-Zugriffsschlüsseln.

    <property>
            <name>fs.azure.account.key.hdistoragecentral.blob.core.windows.net</name>
            <value>access-key-associated-with-the-account</value>
    </property>
    

    b. Entfernen Sie die folgenden Einträge aus core-site.xml:

    <property>
            <name>fs.azure.account.keyprovider.hdistoragecentral.blob.core.windows.net</name>
            <value>org.apache.hadoop.fs.azure.ShellDecryptionKeyProvider</value>
    </property>
    
    <property>
            <name>fs.azure.shellkeyprovider.script</name>
            <value>/usr/lib/python2.7/dist-packages/hdinsight_common/decrypt.sh</value>
    </property>
    
    <property>
            <name>net.topology.script.file.name</name>
            <value>/etc/hadoop/conf/topology_script.py</value>
    </property>
    

    Abschnitt c. Speichern Sie die Datei.

  7. Fügen Sie die Hauptklasse für Ihre Anwendung hinzu. Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf "src", zeigen Sie auf "Neu", und wählen Sie dann "Scala"-Klasse aus.

    IntelliJ IDEA Wählen Sie die Hauptklasse aus.

  8. Geben Sie im Dialogfeld Create New Scala Class einen Namen ein, wählen Sie Object im Feld Kind aus, und wählen Sie dann OK aus.

    IntelliJ IDEA Create new Scala class.

  9. Fügen Sie in der MyClusterAppMain.scala Datei den folgenden Code ein. Dieser Code erstellt den Spark-Kontext und öffnet eine executeJob Methode aus dem SparkSample Objekt.

    import org.apache.spark.{SparkConf, SparkContext}
    
    object SparkSampleMain {
        def main (arg: Array[String]): Unit = {
        val conf = new SparkConf().setAppName("SparkSample")
                                    .set("spark.hadoop.validateOutputSpecs", "false")
        val sc = new SparkContext(conf)
    
        SparkSample.executeJob(sc,
                            "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv",
                            "wasb:///HVACOut")
        }
    }
    
  10. Wiederholen Sie die Schritte 8 und 9, um ein neues Scala-Objekt hinzuzufügen, das aufgerufen wird *SparkSample. Fügen Sie dieser Klasse den folgenden Code hinzu. Dieser Code liest die Daten aus dem HVAC.csv (verfügbar in allen HDInsight Spark-Clustern). Sie ruft die Zeilen ab, die nur eine Ziffer in der siebten Spalte in der CSV-Datei enthalten, und schreibt dann die Ausgabe unter dem Standardspeichercontainer für den Cluster in /HVACOut .

    import org.apache.spark.SparkContext
    
    object SparkSample {
        def executeJob (sc: SparkContext, input: String, output: String): Unit = {
        val rdd = sc.textFile(input)
    
        //find the rows which have only one digit in the 7th column in the CSV
        val rdd1 =  rdd.filter(s => s.split(",")(6).length() == 1)
    
        val s = sc.parallelize(rdd.take(5)).cartesian(rdd).count()
        println(s)
    
        rdd1.saveAsTextFile(output)
        //rdd1.collect().foreach(println)
         }
    }
    
  11. Wiederholen Sie die Schritte 8 und 9, um eine neue Klasse namens RemoteClusterDebugginghinzuzufügen. Diese Klasse implementiert das Spark-Testframework, das zum Debuggen der Anwendungen verwendet wird. Fügen Sie der RemoteClusterDebugging-Klasse folgenden Code hinzu:

        import org.apache.spark.{SparkConf, SparkContext}
        import org.scalatest.FunSuite
    
        class RemoteClusterDebugging extends FunSuite {
    
         test("Remote run") {
           val conf = new SparkConf().setAppName("SparkSample")
                                     .setMaster("yarn-client")
                                     .set("spark.yarn.am.extraJavaOptions", "-Dhdp.version=2.4")
                                     .set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar")
                                     .setJars(Seq("""C:\workspace\IdeaProjects\MyClusterApp\out\artifacts\MyClusterApp_DefaultArtifact\default_artifact.jar"""))
                                     .set("spark.hadoop.validateOutputSpecs", "false")
           val sc = new SparkContext(conf)
    
           SparkSample.executeJob(sc,
             "wasb:///HdiSamples/HdiSamples/SensorSampleData/hvac/HVAC.csv",
             "wasb:///HVACOut")
         }
        }
    

    Es gibt ein paar wichtige Dinge zu beachten:

    • Stellen Sie für .set("spark.yarn.jar", "wasb:///hdp/apps/2.4.2.0-258/spark-assembly-1.6.1.2.4.2.0-258-hadoop2.7.1.2.4.2.0-258.jar")sicher, dass die Spark-Assembly-JAR-Datei im Clusterspeicher unter dem angegebenen Pfad verfügbar ist.
    • Geben Sie für setJars den Speicherort an, an dem das Artefakt JAR erstellt wird. In der Regel ist es <Your IntelliJ project directory>\out\<project name>_DefaultArtifact\default_artifact.jar.
  12. Klicken Sie in der Klasse mit der*RemoteClusterDebugging rechten Maustaste auf das test Schlüsselwort, und wählen Sie dann "RemoteClusterDebugging-Konfiguration erstellen" aus.

    IntelliJ IDEA Erstellen einer Remotekonfiguration.

  13. Geben Sie im Dialogfeld " RemoteClusterDebugging-Konfiguration erstellen " einen Namen für die Konfiguration ein, und wählen Sie dann " Testtyp " als Testnamen aus. Behalten Sie alle anderen Werte als Standardeinstellungen bei. Klicken Sie auf Apply (Anwenden) und dann auf OK.

    Erstellen Sie die RemoteClusterDebugging-Konfiguration.

  14. In der Menüleiste sollte nun eine Dropdownliste Remote run (Remotetestlauf) für die Konfiguration angezeigt werden.

    IntelliJ Die Dropdownliste

Schritt 5: Ausführen der Anwendung im Debugmodus

  1. Öffnen Sie im IntelliJ IDEA-Projekt die Datei SparkSample.scala, und erstellen Sie neben val rdd1 einen Breakpoint. Wählen Sie im Popupmenü Create Breakpoint for (Breakpoint erstellen für) die Option line in function executeJob (Zeile in executeJob-Funktion) aus.

    IntelliJ IDEA Fügen Sie einen Haltepunkt hinzu.

  2. Um die Anwendung auszuführen, wählen Sie die Schaltfläche " Debuggen ausführen " neben der Dropdownliste " Remoteausführungskonfiguration " aus.

    Wählen Sie in IntelliJ IDEA die Schaltfläche

  3. Wenn die Programmausführung den Breakpoint erreicht, wird im unteren Bereich die Registerkarte Debugger angezeigt.

    IntelliJ IDEA: Öffnen Sie die Registerkarte

  4. Um eine Uhr hinzuzufügen, wählen Sie das (+) Symbol aus.

    IntelliJ debug-add-watch-variable.

    In diesem Beispiel ist die Anwendung abgestürzt, bevor die Variable rdd1 erstellt wurde. Mithilfe dieses Überwachungselements können wir die ersten fünf Zeilen in der rdd-Variablen anzeigen. Wählen Sie Geben Sieein.

    IntelliJ Führen Sie das Programm im Debugmodus aus.

    Was Sie in der vorherigen Abbildung sehen, ist, dass Sie zur Laufzeit Terabyte an Daten abfragen und debuggen können, wie sich Ihre Anwendung entwickelt. Beispielsweise können Sie in der ausgabe, die in der vorherigen Abbildung gezeigt wird, sehen, dass die erste Zeile der Ausgabe eine Kopfzeile ist. Basierend auf dieser Ausgabe können Sie den Anwendungscode ändern, um die Kopfzeile bei Bedarf zu überspringen.

  5. Sie können nun das Symbol " Programm fortsetzen " auswählen, um mit der Ausführung der Anwendung fortzufahren.

    IntelliJ IDEA Programmfortsetzung auswählen.

  6. Wenn die Anwendung erfolgreich abgeschlossen ist, sollte die Ausgabe wie folgt angezeigt werden:

    Ausgabe der IntelliJ IDEA-Debuggerkonsole.

Nächste Schritte

Szenarien

Erstellen und Ausführen von Anwendungen

Werkzeuge und Erweiterungen

Ressourcen verwalten