Ausführen von MapReduce-Aufträgen mit Apache Hadoop in HDInsight mithilfe von REST

Erfahren Sie, wie mithilfe der Apache Hive WebHCat-REST-API MapReduce-Aufträge auf einem Apache Hadoop-Cluster in HDInsight ausführen. Curl dient zum Veranschaulichen der Interaktion mit HDInsight über unformatierte HTTP-Anforderungen zum Ausführen von MapReduce-Aufträgen.

Hinweis

Wenn Sie bereits mit der Verwendung von Linux-basierten Hadoop-Servern vertraut sind, nicht jedoch mit HDInsight, lesen Sie den Artikel Informationen zu Linux-basiertem Apache Hadoop in HDInsight.

Voraussetzungen

Optionen:

  • Windows PowerShell oder
  • cURL mit jq

Ausführen eines MapReduce-Auftrags

Hinweis

Wenn Sie Curl oder eine andere REST-Kommunikation mit WebHCat verwenden, müssen Sie die Anforderungen authentifizieren, indem Sie den Benutzernamen und das Kennwort des Administrators des HDInsight-Clusters bereitstellen. Sie müssen den Clusternamen als Teil des URI verwenden, der zum Senden der Anforderungen an den Server genutzt wird.

Die REST-API wird durch Standardauthentifizierunggesichert. Sie sollten Anforderungen immer über HTTPS stellen, um sicherzustellen, dass Ihre Anmeldeinformationen sicher an den Server gesendet werden.

Curl

  1. Legen Sie zur Verbesserung der Benutzerfreundlichkeit die unten aufgeführten Variablen fest. Dieses Beispiel basiert auf einer Windows-Umgebung, die nach Bedarf für Ihre Umgebung überarbeitet werden kann.

    set CLUSTERNAME=
    set PASSWORD=
    
  2. Verwenden Sie den folgenden Befehl in einer Befehlszeile, um zu überprüfen, ob Sie die Verbindung zum HDInsight-Cluster herstellen können:

    curl -u admin:%PASSWORD% -G https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/status
    

    Folgende Parameter werden in diesem Befehl verwendet:

    • -u: Gibt den Benutzernamen und das Kennwort für die Authentifizierung der Anforderung an
    • -G: Gibt an, dass dieser Vorgang eine GET-Anforderung ist

    Der Anfang des URI (https://CLUSTERNAME.azurehdinsight.net/templeton/v1) ist für alle Anforderungen gleich.

    Sie erhalten eine Antwort, die in etwa dem folgenden JSON entspricht:

    {"version":"v1","status":"ok"}
    
  3. Verwenden Sie den folgenden Befehl, um einen MapReduce-Auftrag zu übermitteln. Ändern Sie nach Bedarf den Pfad zu jq.

    curl -u admin:%PASSWORD% -d user.name=admin ^
    -d jar=/example/jars/hadoop-mapreduce-examples.jar ^
    -d class=wordcount -d arg=/example/data/gutenberg/davinci.txt -d arg=/example/data/output ^
    https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/mapreduce/jar | ^
    C:\HDI\jq-win64.exe .id
    

    Das Ende des URIs (/mapreduce/jar) weist WebHCat darauf hin, dass diese Anforderung einen MapReduce-Auftrag aus einer Klasse in einer JAR-Datei startet. Folgende Parameter werden in diesem Befehl verwendet:

    • -d:-G wird nicht verwendet, daher verwendet die Anforderung standardmäßig die POST-Methode. -d gibt die Datenwerte an, die mit der Anforderung gesendet werden.
      • user.name: Der Benutzer, der den Befehl ausführt
      • jar: Der Speicherort der JAR-Datei, die die auszuführende Klasse enthält
      • class: Die Klasse, die die MapReduce-Logik enthält
      • arg: Die Argumente, die an den MapReduce-Auftrag übergeben werden, in diesem Fall die Eingabetextdatei und das Verzeichnis für die Ausgabe

    Dieser Befehl sollte eine Auftrags-ID zurückgeben, mit der der Status des Auftrags überprüft werden kann: job_1415651640909_0026.

  4. Verwenden Sie den folgenden Befehl, um den Status des Auftrags zu prüfen. Ersetzen Sie den Wert für JOBID durch den tatsächlichen Wert, der im vorherigen Schritt zurückgegeben wurde. Ändern Sie den Speicherort von jq nach Bedarf.

    set JOBID=job_1415651640909_0026
    
    curl -G -u admin:%PASSWORD% -d user.name=admin https://%CLUSTERNAME%.azurehdinsight.net/templeton/v1/jobs/%JOBID% | ^
    C:\HDI\jq-win64.exe .status.state
    

PowerShell

  1. Legen Sie zur Verbesserung der Benutzerfreundlichkeit die unten aufgeführten Variablen fest. Ersetzen Sie CLUSTERNAME durch den tatsächlichen Clusternamen. Führen Sie den Befehl aus, und geben Sie nach Aufforderung das Anmeldekennwort für den Cluster ein.

    $clusterName="CLUSTERNAME"
    $creds = Get-Credential -UserName admin -Message "Enter the cluster login password"
    
  2. Verwenden Sie den folgenden Befehl, um zu überprüfen, ob Sie die Verbindung mit dem HDInsight-Cluster herstellen können:

    $resp = Invoke-WebRequest -Uri "https://$clustername.azurehdinsight.net/templeton/v1/status" `
        -Credential $creds `
        -UseBasicParsing
    $resp.Content
    

    Sie erhalten eine Antwort, die in etwa dem folgenden JSON entspricht:

    {"version":"v1","status":"ok"}
    
  3. Verwenden Sie den folgenden Befehl, um einen MapReduce-Auftrag zu übermitteln.

    $reqParams = @{}
    $reqParams."user.name" = "admin"
    $reqParams.jar = "/example/jars/hadoop-mapreduce-examples.jar"
    $reqParams.class = "wordcount"
    $reqParams.arg = @()
    $reqParams.arg += "/example/data/gutenberg/davinci.txt"
    $reqparams.arg += "/example/data/output"
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/mapreduce/jar" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Das Ende des URIs (/mapreduce/jar) weist WebHCat darauf hin, dass diese Anforderung einen MapReduce-Auftrag aus einer Klasse in einer JAR-Datei startet. Folgende Parameter werden in diesem Befehl verwendet:

    • user.name: Der Benutzer, der den Befehl ausführt
    • jar: Der Speicherort der JAR-Datei, die die auszuführende Klasse enthält
    • class: Die Klasse, die die MapReduce-Logik enthält
    • arg: Die Argumente, die an den MapReduce-Auftrag übergeben werden, in diesem Fall die Eingabetextdatei und das Verzeichnis für die Ausgabe

    Dieser Befehl sollte eine Auftrags-ID zurückgeben, mit der der Status des Auftrags überprüft werden kann: job_1415651640909_0026.

  4. Verwenden Sie den folgenden Befehl, um den Status des Auftrags zu prüfen:

    $reqParams=@{"user.name"="admin"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" `
       -Credential $creds `
       -Body $reqParams `
       -UseBasicParsing
    
    # ConvertFrom-JSON can't handle duplicate names with different case
    # So change one to prevent the error
    $fixDup=$resp.Content.Replace("jobID","job_ID")
    (ConvertFrom-Json $fixDup).status.state
    

Beide Methoden

  1. Wenn der Auftrag abgeschlossen ist, wird der Status SUCCEEDED angezeigt.

  2. Sobald der Status des Auftrags in SUCCEEDED wechselt, können Sie die Ergebnisse des Auftrags aus Azure Blob Storage abrufen. Der mit der Abfrage übergebene Parameter statusdir enthält den Speicherort der Ausgabedatei. In diesem Beispiel ist dies /example/curl. Diese Adresse speichert die Ausgabe des Auftrags unter /example/curl im Standardspeicher des Clusters.

Sie können diese Dateien mithilfe der Azure-Befehlszeilenschnittstelle auflisten und herunterladen. Weitere Informationen zur Verwendung der Azure CLI für das Arbeiten mit Azure Blob Storage finden Sie unter Schnellstart: Erstellen, Herunterladen und Auflisten von Blobs mit der Azure-Befehlszeilenschnittstelle.

Nächste Schritte

Informationen zu anderen Möglichkeiten, wie Sie mit Hadoop in HDInsight arbeiten können:

Weitere Informationen zur REST-Schnittstelle, die in diesem Artikel verwendet wird, finden Sie in der WebHCat-Referenz.