Dela via


Köra MapReduce-jobb med Apache Hadoop på HDInsight med 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 innehåller cmdletar som gör att du kan fjärrköra MapReduce-jobb i 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
Anslut-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. Det väntar tills jobbet har slutförts eller väntetiden har överskridits.
Get-AzHDInsightJobOutput Används för att hämta utdata från jobbet.

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

  1. Spara följande kod som mapreducejob.ps1 med hjälp av en redigerare.

    # 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 filen mapreducejob.ps1 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 är klart 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
    

    Det här utdata anger att jobbet har slutförts.

    Kommentar

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

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

Visa utdata

Om du vill se de ord och antal som skapas av jobbet öppnar du filen output.txt i en textredigerare.

Kommentar

Utdatafilerna för ett MapReduce-jobb är oföränderliga. Om du kör exemplet igen måste du ändra namnet på utdatafilen.

Felsökning

Om ingen information returneras när jobbet är klart 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 filen mapreducejob.ps1 . 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. För information om andra sätt att arbeta med Hadoop på HDInsight: