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

Dieses Dokument enthält ein Beispiel zur Verwendung von Azure PowerShell zum Ausführen eines MapReduce-Auftrags in einem Hadoop-Cluster in HDInsight.

Voraussetzungen

Ausführen eines MapReduce-Auftrags

Azure PowerShell stellt Cmdlets bereit, mit denen Sie MapReduce-Aufträge in HDInsight remote ausführen können. Intern sendet PowerShell REST-Aufrufe an die auf dem HDInsight-Cluster ausgeführte Anwendung WebHCat (früher Templeton genannt).

Die folgenden Cmdlets werden zum Ausführen der MapReduce-Aufträge in einem HDInsight-Remotecluster verwendet.

Cmdlet BESCHREIBUNG
Connect-AzAccount Authentifiziert Azure PowerShell für Ihr Azure-Abonnement.
New-AzHDInsightMapReduceJobDefinition Erstellt aus den angegebenen MapReduce-Informationen eine neue Auftragsdefinition.
Start-AzHDInsightJob Sendet die Auftragsdefinition an HDInsight und startet den Auftrag. Ein Auftragsobjekt wird zurückgegeben.
Wait-AzHDInsightJob Verwendet das Auftragsobjekt, um den Status des Auftrags zu prüfen. Es wird gewartet, bis der Auftrag abgeschlossen oder die Wartezeit überschritten ist.
Get-AzHDInsightJobOutput Wird verwendet, um die Ausgabe des Auftrags abzurufen.

Die folgenden Schritte veranschaulichen, wie diese Cmdlets zum Ausführen eines Auftrags in einem HDInsight-Cluster verwendet werden.

  1. Speichern Sie den folgenden Code in einem Editor in einer Datei namens mapreducejob.ps1.

    # Login to your Azure subscription
    $context = Get-AzContext
    if ($context -eq $null) 
    {
        Connect-AzAccount
    }
    $context
    
    # Get cluster info
    $clusterName = Read-Host -Prompt "Enter the HDInsight cluster name"
    $creds=Get-Credential -Message "Enter the login for the cluster"
    
    #Get the cluster info so we can get the resource group, storage, etc.
    $clusterInfo = Get-AzHDInsightCluster -ClusterName $clusterName
    $resourceGroup = $clusterInfo.ResourceGroup
    $storageAccountName=$clusterInfo.DefaultStorageAccount.split('.')[0]
    $container=$clusterInfo.DefaultStorageContainer
    #NOTE: This assumes that the storage account is in the same resource
    #      group as the cluster. If it is not, change the
    #      --ResourceGroupName parameter to the group that contains storage.
    $storageAccountKey=(Get-AzStorageAccountKey `
        -Name $storageAccountName `
    -ResourceGroupName $resourceGroup)[0].Value
    
    #Create a storage context
    $context = New-AzStorageContext `
        -StorageAccountName $storageAccountName `
        -StorageAccountKey $storageAccountKey
    
    #Define the MapReduce job
    #NOTE: If using an HDInsight 2.0 cluster, use hadoop-examples.jar instead.
    # -JarFile = the JAR containing the MapReduce application
    # -ClassName = the class of the application
    # -Arguments = The input file, and the output directory
    $wordCountJobDefinition = New-AzHDInsightMapReduceJobDefinition `
        -JarFile "/example/jars/hadoop-mapreduce-examples.jar" `
        -ClassName "wordcount" `
        -Arguments `
            "/example/data/gutenberg/davinci.txt", `
            "/example/data/WordCountOutput"
    
    #Submit the job to the cluster
    Write-Host "Start the MapReduce job..." -ForegroundColor Green
    $wordCountJob = Start-AzHDInsightJob `
        -ClusterName $clusterName `
        -JobDefinition $wordCountJobDefinition `
        -HttpCredential $creds
    
    #Wait for the job to complete
    Write-Host "Wait for the job to complete..." -ForegroundColor Green
    Wait-AzHDInsightJob `
        -ClusterName $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds
    # Download the output
    Get-AzStorageBlobContent `
        -Blob 'example/data/WordCountOutput/part-r-00000' `
        -Container $container `
        -Destination output.txt `
        -Context $context
    # Print the output of the job.
    Get-AzHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds
    
  2. Öffnen Sie eine neue Azure PowerShell -Befehlsaufforderung. Navigieren Sie zum Speicherort der Datei mapreducejob.ps1 , und verwenden Sie folgenden Befehl zum Ausführen des Skripts.

    .\mapreducejob.ps1
    

    Wenn Sie das Skript ausführen, werden Sie dazu aufgefordert, den Namen des HDInsight-Clusters und die Anmeldedaten für den Cluster einzugeben. Sie werden außerdem möglicherweise dazu aufgefordert, sich bei Ihrem Azure-Abonnement zu authentifizieren.

  3. Nach Abschluss des Auftrags erhalten Sie eine Ausgabe ähnlich der folgenden:

    Cluster         : CLUSTERNAME
    ExitCode        : 0
    Name            : wordcount
    PercentComplete : map 100% reduce 100%
    Query           :
    State           : Completed
    StatusDirectory : f1ed2028-afe8-402f-a24b-13cc17858097
    SubmissionTime  : 12/5/2014 8:34:09 PM
    JobId           : job_1415949758166_0071
    

    Diese Ausgabe gibt an, dass der Auftrag erfolgreich abgeschlossen wurde.

    Hinweis

    Wenn sich für ExitCode ein anderer Wert als 0 ergibt, finden Sie weitere Informationen unter Troubleshooting.

    In diesem Beispiel werden außerdem die heruntergeladenen Dateien in der Datei output.txt in dem Verzeichnis gespeichert, von dem aus Sie das Skript ausführen.

Anzeigen der Ausgabe

Öffnen Sie die Datei output.txt in einem Texteditor, um die von dem Auftrag erzeugten Wörter und Zählerstände anzuzeigen.

Hinweis

Die Ausgabedateien eines MapReduce-Auftrags sind unveränderlich. Wenn Sie dieses Beispiel erneut ausführen, müssen Sie daher den Namen der Ausgabedatei ändern.

Problembehandlung

Wenn keine Informationen zurückgegeben werden, wenn der Auftrag abgeschlossen ist, zeigen Sie die Fehlermeldungen für den Auftrag an. Um Fehlerinformationen für diesen Auftrag anzuzeigen, fügen Sie folgenden Befehl am Ende der Datei mapreducejob.ps1 hinzu. Speichern Sie anschließend die Datei, und führen Sie das Skript erneut aus.

# Print the output of the WordCount job.
Write-Host "Display the standard output ..." -ForegroundColor Green
Get-AzHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds `
        -DisplayOutputType StandardError

Mit diesem Cmdlet werden die Informationen zurückgegeben, die bei der Auftragsverarbeitung in STDERR geschrieben wurden.

Nächste Schritte

Wie Sie sehen können, bietet Azure PowerShell eine einfache Möglichkeit, um MapReduce-Aufträge auf einem HDInsight-Cluster auszuführen, den Auftragsstatus zu überwachen und die Ausgabe abzurufen. Informationen zu anderen Möglichkeiten, wie Sie mit Hadoop in HDInsight arbeiten können: