Köra MapReduce-jobb med Apache Hadoop i HDInsight med hjälp av PowerShell

Det här dokumentet innehåller ett exempel på hur du använder Azure PowerShell för att köra ett MapReduce-jobb i ett Hadoop på HDInsight-kluster.

Förutsättningar

Köra ett MapReduce-jobb

Azure PowerShell tillhandahåller cmdletar som gör att du kan fjärrköra MapReduce-jobb på HDInsight. Internt gör PowerShell REST-anrop till WebHCat (kallades tidigare Templeton) som körs i HDInsight-klustret.

Följande cmdletar används när du kör MapReduce-jobb i ett fjärranslutet HDInsight-kluster.

Cmdlet Beskrivning
Connect-AzAccount Autentiserar Azure PowerShell till din Azure-prenumeration.
New-AzHDInsightMapReduceJobDefinition Skapar en ny jobbdefinition med hjälp av den angivna MapReduce-informationen.
Start-AzHDInsightJob Skickar jobbdefinitionen till HDInsight och startar jobbet. Ett jobbobjekt returneras.
Wait-AzHDInsightJob Använder jobbobjektet för att kontrollera jobbets status. Den väntar tills jobbet har slutförts eller väntetiden har överskridits.
Get-AzHDInsightJobOutput Används för att hämta utdata för jobbet.

Följande steg visar hur du använder dessa cmdletar för att köra ett jobb i ditt HDInsight-kluster.

  1. Använd en redigerare och spara följande kod som 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. Öppna en ny Azure PowerShell kommandotolk. Ändra kataloger till platsen för mapreducejob.ps1-filen och använd sedan följande kommando för att köra skriptet:

    .\mapreducejob.ps1
    

    När du kör skriptet uppmanas du att ange namnet på HDInsight-klustret och klusterinloggningen. Du kan också uppmanas att autentisera till din Azure-prenumeration.

  3. När jobbet har slutförts får du utdata som liknar följande text:

    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
    

    Dessa utdata anger att jobbet har slutförts.

    Anteckning

    Om ExitCode är ett annat värde än 0 läser du Felsökning.

    I det här exemplet lagras även de nedladdade filerna i en output.txt-fil i katalogen som du kör skriptet från.

Visa utdata

Om du vill se ord och antal som skapats av jobbet öppnar du filenoutput.txt i en textredigerare.

Anteckning

Utdatafilerna för ett MapReduce-jobb kan inte ändras. Så om du kör det här exemplet igen måste du ändra namnet på utdatafilen.

Felsökning

Om ingen information returneras när jobbet har slutförts kan du visa fel för jobbet. Om du vill visa felinformation för det här jobbet lägger du till följande kommando i slutet av mapreducejob.ps1-filen . Spara sedan filen och kör skriptet igen.

# 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

Den här cmdleten returnerar den information som skrevs till STDERR när jobbet körs.

Nästa steg

Som du ser är Azure PowerShell ett enkelt sätt att köra MapReduce-jobb på ett HDInsight-kluster, övervaka jobbstatusen och hämta utdata. Information om andra sätt att arbeta med Hadoop på HDInsight: