Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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:
- 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.
- Erstellen Sie einen Spark-Cluster in HDInsight, der Teil des virtuellen Standortnetzwerks ist.
- Überprüfen Sie die Konnektivität zwischen dem Clusterkopfknoten und dem Desktop.
- Erstellen Sie eine Skala-Anwendung in IntelliJ IDEA, und konfigurieren Sie sie dann für das Remotedebugging.
- 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:
- Erstellen eines VNet mit einer Standort-zu-Standort-VPN-Verbindung mithilfe des Azure-Portals
- Erstellen eines VNet mit einer Standort-zu-Standort-VPN-Verbindung mithilfe von PowerShell
- Konfigurieren einer Punkt-zu-Standort-VPN-Verbindung mit einem virtuellen Netzwerk mithilfe von PowerShell
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
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 auf der Ambari-Benutzeroberfläche "Hosts" aus.
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.
Aus dem Bereich Zusammenfassung unten auf der geöffneten Seite kopieren Sie die IP-Adresse des Kopfknotens und den Hostnamen.
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Ü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.
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
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
Öffnen Sie IntelliJ IDEA, und erstellen Sie ein neues Projekt. Gehen Sie im Dialogfeld Neues Projekt wie folgt vor:
a) Wählen Sie HDInsight>Spark auf HDInsight (Scala) aus.
b. Wählen Sie Weiteraus.
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.
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.
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.
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.1org.apache.hadoop:hadoop-azure:2.7.1
Kopieren Sie
yarn-site.xmlundcore-site.xmlvom 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 folgendenscpBefehle 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.Aktualisieren Sie die
core-site.xmlDatei, um die folgenden Änderungen vorzunehmen:a) Ersetzen Sie den verschlüsselten Schlüssel. Die
core-site.xmlDatei enthält den verschlüsselten Schlüssel zum Speicherkonto, das dem Cluster zugeordnet ist. Ersetzen Sie in dercore-site.xmlDatei, 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.
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.
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.
Fügen Sie in der
MyClusterAppMain.scalaDatei den folgenden Code ein. Dieser Code erstellt den Spark-Kontext und öffnet eineexecuteJobMethode aus demSparkSampleObjekt.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") } }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) } }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 derRemoteClusterDebugging-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
setJarsden 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.
- Stellen Sie für
Klicken Sie in der Klasse mit der
*RemoteClusterDebuggingrechten Maustaste auf dastestSchlüsselwort, und wählen Sie dann "RemoteClusterDebugging-Konfiguration erstellen" aus.
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.
In der Menüleiste sollte nun eine Dropdownliste Remote run (Remotetestlauf) für die Konfiguration angezeigt werden.
Schritt 5: Ausführen der Anwendung im Debugmodus
Öffnen Sie im IntelliJ IDEA-Projekt die Datei
SparkSample.scala, und erstellen Sie nebenval rdd1einen Breakpoint. Wählen Sie im Popupmenü Create Breakpoint for (Breakpoint erstellen für) die Option line in function executeJob (Zeile in executeJob-Funktion) aus.
Um die Anwendung auszuführen, wählen Sie die Schaltfläche " Debuggen ausführen " neben der Dropdownliste " Remoteausführungskonfiguration " aus.
Wenn die Programmausführung den Breakpoint erreicht, wird im unteren Bereich die Registerkarte Debugger angezeigt.
Um eine Uhr hinzuzufügen, wählen Sie das (+) Symbol aus.
In diesem Beispiel ist die Anwendung abgestürzt, bevor die Variable
rdd1erstellt wurde. Mithilfe dieses Überwachungselements können wir die ersten fünf Zeilen in derrdd-Variablen anzeigen. Wählen Sie Geben Sieein.
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.
Sie können nun das Symbol " Programm fortsetzen " auswählen, um mit der Ausführung der Anwendung fortzufahren.
Wenn die Anwendung erfolgreich abgeschlossen ist, sollte die Ausgabe wie folgt angezeigt werden:
Nächste Schritte
Szenarien
- Apache Spark mit BI: Durchführen interaktiver Datenanalysen mithilfe von Spark in HDInsight mit BI-Tools
- Apache Spark mit Machine Learning: Analysieren von Gebäudetemperaturen mithilfe von Spark in HDInsight und HVAC-Daten
- Apache Spark mit Machine Learning: Vorhersage von Lebensmittelkontrollergebnissen mithilfe von Spark in HDInsight
- Websiteprotokollanalyse mithilfe von Apache Spark in HDInsight
Erstellen und Ausführen von Anwendungen
- Erstellen einer eigenständigen Anwendung mit Scala
- Ausführen von Remoteaufträgen in einem Apache Spark-Cluster mithilfe von Apache Livy
Werkzeuge und Erweiterungen
- Erstellen von Apache Spark-Anwendungen für einen HDInsight-Cluster mit dem Azure-Toolkit für IntelliJ
- Verwenden des Azure Toolkits für IntelliJ zum Remotedebugging von Apache Spark-Anwendungen über SSH
- Verwenden der HDInsight-Tools im Azure-Toolkit für Eclipse zum Erstellen von Apache Spark-Anwendungen
- Verwenden von Apache Zeppelin-Notizbüchern mit einem Apache Spark-Cluster in HDInsight
- Verfügbare Kernels für Jupyter Notebooks in einem Apache Spark-Cluster für HDInsight
- Verwenden von externen Paketen mit Jupyter Notebooks
- Installieren von Jupyter Notebook auf Ihrem Computer und Herstellen einer Verbindung zum Apache Spark-Cluster in Azure HDInsight (Vorschau)