Übermitteln von Remoteaufträgen an einen HDInsight Spark-Cluster mithilfe der Apache Spark-REST-APIUse Apache Spark REST API to submit remote jobs to an HDInsight Spark cluster

Erfahren Sie, wie Sie Apache Livy, die Apache Spark-REST-API, verwenden, um Remoteaufträge an einen Azure HDInsight Spark-Cluster zu übermitteln.Learn how to use Apache Livy, the Apache Spark REST API, which is used to submit remote jobs to an Azure HDInsight Spark cluster. Eine ausführliche Dokumentation finden Sie unter https://livy.incubator.apache.org/.For detailed documentation, see https://livy.incubator.apache.org/.

Mit Livy können Sie interaktive Spark-Shells ausführen oder Batchaufträge zur Ausführung in Spark übermitteln.You can use Livy to run interactive Spark shells or submit batch jobs to be run on Spark. In diesem Artikel wird die Übermittlung von Batchaufträgen mithilfe von Livy behandelt.This article talks about using Livy to submit batch jobs. Die Codeausschnitte in diesem Artikel verwenden cURL für an den Livy Spark-Endgerät gerichtete REST-API-Aufrufe.The snippets in this article use cURL to make REST API calls to the Livy Spark endpoint.

VoraussetzungenPrerequisites

Übermitteln eines Apache Livy Spark-BatchvorgangsSubmit an Apache Livy Spark batch job

Vor dem Übermitteln eines Batchauftrags muss die JAR-Anwendungsdatei an den Clusterspeicher hochgeladen werden, der dem Cluster zugeordnet ist.Before you submit a batch job, you must upload the application jar on the cluster storage associated with the cluster. Hierzu können Sie das Befehlszeilenprogramm AzCopy verwenden.You can use AzCopy, a command-line utility, to do so. Die Daten können aber auch mit verschiedenen anderen Clients hochgeladen werden.There are various other clients you can use to upload data. Weitere Informationen finden Sie unter Hochladen von Daten für Hadoop-Aufträge in HDInsight.You can find more about them at Upload data for Apache Hadoop jobs in HDInsight.

curl -k --user "<hdinsight user>:<user password>" -v -H "Content-Type: application/json" -X POST -d '{ "file":"<path to application jar>", "className":"<classname in jar>" }' 'https://<spark_cluster_name>.azurehdinsight.net/livy/batches' -H "X-Requested-By: admin"

BeispieleExamples

  • In diesem Beispiel befindet sich die JAR-Datei im Clusterspeicher (WASB):If the jar file is on the cluster storage (WASB)

    curl -k --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST -d '{ "file":"wasb://mycontainer@mystorageaccount.blob.core.windows.net/data/SparkSimpleTest.jar", "className":"com.microsoft.spark.test.SimpleFile" }' "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    
  • In diesem Beispiel möchten Sie den Namen der JAR-Datei und den Klassennamen als Teil der Eingabedatei „input.txt“ übergeben:If you want to pass the jar filename and the classname as part of an input file (in this example, input.txt)

    curl -k  --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST --data @C:\Temp\input.txt "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    

Abrufen von Informationen zu im Cluster ausgeführten Livy Spark-BatchesGet information on Livy Spark batches running on the cluster

Syntax:Syntax:

curl -k --user "<hdinsight user>:<user password>" -v -X GET "https://<spark_cluster_name>.azurehdinsight.net/livy/batches"

BeispieleExamples

  • In diesem Beispiel sollen alle im Cluster ausgeführten Livy Spark-Batches abgerufen werden:If you want to retrieve all the Livy Spark batches running on the cluster:

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches" 
    
  • In diesem Beispiel möchten Sie einen spezifischen Batch mit einer bestimmten Batch-ID abrufen:If you want to retrieve a specific batch with a given batch ID

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches/{batchId}"
    

Löschen eines Livy Spark-BatchvorgangsDelete a Livy Spark batch job

curl -k --user "<hdinsight user>:<user password>" -v -X DELETE "https://<spark_cluster_name>.azurehdinsight.net/livy/batches/{batchId}"

BeispielExample

Löschen des Batch-Auftrags mit der Batch-ID 5Deleting a batch job with batch ID 5.

curl -k --user "admin:mypassword1!" -v -X DELETE "https://mysparkcluster.azurehdinsight.net/livy/batches/5"

Livy Spark und hohe VerfügbarkeitLivy Spark and high-availability

Livy bietet hohe Verfügbarkeit für im Cluster ausgeführte Spark-Aufträge.Livy provides high-availability for Spark jobs running on the cluster. Hier sind einige Beispiele angegeben:Here is a couple of examples.

  • Wenn der Livy-Dienst nach der Übermittlung eines Remoteauftrags an einen Spark-Cluster abstürzt, wird der Auftrag weiterhin im Hintergrund ausgeführt.If the Livy service goes down after you have submitted a job remotely to a Spark cluster, the job continues to run in the background. Wenn Livy wieder funktioniert, stellt es den Status des Auftrags wieder her und erstattet Bericht.When Livy is back up, it restores the status of the job and reports it back.
  • Jupyter Notebooks für HDInsight wird am Back-End durch Livy unterstützt.Jupyter notebooks for HDInsight are powered by Livy in the backend. Wenn ein Notebook einen Spark-Auftrag ausführt und der Livy-Dienst neu gestartet wird, führt das Notebook weiterhin die Codezellen aus.If a notebook is running a Spark job and the Livy service gets restarted, the notebook continues to run the code cells.

BeispieleShow me an example

In diesem Abschnitt erfahren Sie anhand von Beispielen, wie Sie mit Livy Spark einen Batchvorgang übermitteln, den Status des Vorgangs überwachen und den Vorgang anschließend löschen.In this section, we look at examples to use Livy Spark to submit batch job, monitor the progress of the job, and then delete it. Dabei verwenden wir die im Artikel Erstellen einer eigenständigen Scala-Anwendung zur Ausführung in HDInsight Spark-Clusternentwickelte Anwendung.The application we use in this example is the one developed in the article Create a standalone Scala application and to run on HDInsight Spark cluster. Bei den folgenden Schritten wird von Folgendem ausgegangen:The steps here assume that:

  • Die JAR-Anwendungsdatei wurde bereits in das dem Cluster zugeordnete Speicherkonto kopiert.You have already copied over the application jar to the storage account associated with the cluster.
  • Auf dem Computer, auf dem die Schritte ausgeführt werden, ist cURL installiert.You have CuRL installed on the computer where you are trying these steps.

Führen Sie die folgenden Schritte aus:Perform the following steps:

  1. Überprüfen Sie zunächst, ob Livy Spark im Cluster ausgeführt wird.Let us first verify that Livy Spark is running on the cluster. Dazu können Sie eine Liste mit ausgeführten Batches abrufen.We can do so by getting a list of running batches. Bei der erstmaligen Ausführung eines Auftrags mithilfe von Livy wird Null zurückgegeben.If you are running a job using Livy for the first time, the output should return zero.

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches"
    

    Die Ausgabe sollte in etwa wie folgender Codeausschnitt aussehen:You should get an output similar to the following snippet:

    < HTTP/1.1 200 OK
    < Content-Type: application/json; charset=UTF-8
    < Server: Microsoft-IIS/8.5
    < X-Powered-By: ARR/2.5
    < X-Powered-By: ASP.NET
    < Date: Fri, 20 Nov 2015 23:47:53 GMT
    < Content-Length: 34
    <
    {"from":0,"total":0,"sessions":[]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Beachten Sie, dass in der letzten Zeile der Ausgabe total:0 angegeben ist. Das bedeutet, dass keine Batches ausgeführt werden.Notice how the last line in the output says total:0, which suggests no running batches.

  2. Übermitteln wir nun einen Batchauftrag.Let us now submit a batch job. Im folgenden Codeausschnitt werden mithilfe einer Eingabedatei namens „input.txt“ der JAR-Name und der Klassenname als Parameter übergeben.The following snippet uses an input file (input.txt) to pass the jar name and the class name as parameters. Beim Ausführen der Schritte auf einem Windows-Computer wird die Verwendung einer Eingabedatei empfohlen.If you are running these steps from a Windows computer, using an input file is the recommended approach.

    curl -k --user "admin:mypassword1!" -v -H "Content-Type: application/json" -X POST --data @C:\Temp\input.txt "https://mysparkcluster.azurehdinsight.net/livy/batches" -H "X-Requested-By: admin"
    

    Die Parameter in der Datei input.txt sind wie folgt definiert:The parameters in the file input.txt are defined as follows:

    { "file":"wasb:///example/jars/SparkSimpleApp.jar", "className":"com.microsoft.spark.example.WasbIOTest" }
    

    Die Ausgabe sollte in etwa wie folgender Codeausschnitt aussehen:You should see an output similar to the following snippet:

    < HTTP/1.1 201 Created
    < Content-Type: application/json; charset=UTF-8
    < Location: /0
    < Server: Microsoft-IIS/8.5
    < X-Powered-By: ARR/2.5
    < X-Powered-By: ASP.NET
    < Date: Fri, 20 Nov 2015 23:51:30 GMT
    < Content-Length: 36
    <
    {"id":0,"state":"starting","log":[]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Beachten Sie die Angabe state:startingin der letzten Zeile der Ausgabe.Notice how the last line of the output says state:starting. Und die Angabe id:0.It also says, id:0. 0 ist hier die Batch-ID.Here, 0 is the batch ID.

  3. Anhand der Batch-ID können Sie nun den Status dieses speziellen Batchs abrufen.You can now retrieve the status of this specific batch using the batch ID.

    curl -k --user "admin:mypassword1!" -v -X GET "https://mysparkcluster.azurehdinsight.net/livy/batches/0"
    

    Die Ausgabe sollte in etwa wie folgender Codeausschnitt aussehen:You should see an output similar to the following snippet:

    < HTTP/1.1 200 OK
    < Content-Type: application/json; charset=UTF-8
    < Server: Microsoft-IIS/8.5
    < X-Powered-By: ARR/2.5
    < X-Powered-By: ASP.NET
    < Date: Fri, 20 Nov 2015 23:54:42 GMT
    < Content-Length: 509
    <
    {"id":0,"state":"success","log":["\t diagnostics: N/A","\t ApplicationMaster host: 10.0.0.4","\t ApplicationMaster RPC port: 0","\t queue: default","\t start time: 1448063505350","\t final status: SUCCEEDED","\t tracking URL: http://hn0-myspar.lpel1gnnvxne3gwzqkfq5u5uzh.jx.internal.cloudapp.net:8088/proxy/application_1447984474852_0002/","\t user: root","15/11/20 23:52:47 INFO Utils: Shutdown hook called","15/11/20 23:52:47 INFO Utils: Deleting directory /tmp/spark-b72cd2bf-280b-4c57-8ceb-9e3e69ac7d0c"]}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Die Ausgabe enthält nun state:success. Der Auftrag wurde also erfolgreich abgeschlossen.The output now shows state:success, which suggests that the job was successfully completed.

  4. Wenn Sie möchten, können Sie den Batch jetzt löschen.If you want, you can now delete the batch.

    curl -k --user "admin:mypassword1!" -v -X DELETE "https://mysparkcluster.azurehdinsight.net/livy/batches/0"
    

    Die Ausgabe sollte in etwa wie folgender Codeausschnitt aussehen:You should see an output similar to the following snippet:

    < HTTP/1.1 200 OK
    < Content-Type: application/json; charset=UTF-8
    < Server: Microsoft-IIS/8.5
    < X-Powered-By: ARR/2.5
    < X-Powered-By: ASP.NET
    < Date: Sat, 21 Nov 2015 18:51:54 GMT
    < Content-Length: 17
    <
    {"msg":"deleted"}* Connection #0 to host mysparkcluster.azurehdinsight.net left intact
    

    Die letzte Zeile der Ausgabe zeigt, dass der Batch erfolgreich gelöscht wurde.The last line of the output shows that the batch was successfully deleted. Beim Löschen eines ausgeführten Auftrags wird dieser gleichzeitig beendet.Deleting a job, while it is running, also kills the job. Beim Löschen eines (erfolgreich oder anderweitig) abgeschlossenen Auftrags werden die Auftragsinformationen vollständig gelöscht.If you delete a job that has completed, successfully or otherwise, it deletes the job information completely.

Aktualisierungen der Livy-Konfiguration ab Version 3.5 von HDInsightUpdates to Livy configuration starting with HDInsight 3.5 version

HDInsight-Cluster mit Version 3.5 und höheren Versionen deaktivieren standardmäßig die Verwendung der lokalen Dateipfade für den Zugriff auf Beispieldatendateien oder JAR-Dateien.HDInsight 3.5 clusters and above, by default, disable use of local file paths to access sample data files or jars. Wir empfehlen Ihnen stattdessen die Verwendung des wasb://-Pfads, um aus dem Cluster auf Beispieldatendateien oder JAR-Dateien zuzugreifen.We encourage you to use the wasb:// path instead to access jars or sample data files from the cluster.

Übermitteln von Livy-Aufträgen für einen Cluster in einem virtuellen Azure-NetzwerkSubmitting Livy jobs for a cluster within an Azure virtual network

Wenn Sie aus einer Azure Virtual Network-Instanz eine Verbindung mit einem HDInsight Spark-Cluster herstellen, können Sie direkt eine Verbindung mit Livy im Cluster herstellen.If you connect to an HDInsight Spark cluster from within an Azure Virtual Network, you can directly connect to Livy on the cluster. In diesem Fall lautet die URL für den Livy-Endpunkt http://<IP address of the headnode>:8998/batches.In such a case, the URL for Livy endpoint is http://<IP address of the headnode>:8998/batches. 8998 ist der Port, an dem Livy im Clusterhauptknoten ausgeführt wird.Here, 8998 is the port on which Livy runs on the cluster headnode. Weitere Informationen zum Zugreifen auf Dienste über nicht öffentliche Ports finden Sie unter Ports für Apache Hadoop-Dienste in HDInsight.For more information on accessing services on non-public ports, see Ports used by Apache Hadoop services on HDInsight.

Nächste SchritteNext steps