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
Ein Apache Hadoop-Cluster in HDInsight. Siehe Erstellen von Apache Hadoop-Clustern im Azure-Portal.
Das PowerShell-Az-Modul ist installiert.
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.
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
Ö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.
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: