Share via


MapReduce-taken uitvoeren met Apache Hadoop in HDInsight met behulp van PowerShell

Dit document bevat een voorbeeld van het gebruik van Azure PowerShell om een MapReduce-taak uit te voeren in een Hadoop in HDInsight-cluster.

Vereisten

Een MapReduce-taak uitvoeren

Azure PowerShell biedt cmdlets waarmee u MapReduce-taken op afstand kunt uitvoeren in HDInsight. Intern voert PowerShell REST-aanroepen uit naar WebHCat (voorheen Templeton) die worden uitgevoerd op het HDInsight-cluster.

De volgende cmdlets worden gebruikt bij het uitvoeren van MapReduce-taken in een extern HDInsight-cluster.

Cmdlet Beschrijving
Connect-AzAccount Verifieert Azure PowerShell voor uw Azure-abonnement.
New-AzHDInsightMapReduceJobDefinition Hiermee maakt u een nieuwe taakdefinitie met behulp van de opgegeven MapReduce-informatie.
Start-AzHDInsightJob Verzendt de taakdefinitie naar HDInsight en start de taak. Er wordt een taakobject geretourneerd.
Wait-AzHDInsightJob Hiermee gebruikt u het taakobject om de status van de taak te controleren. Er wordt gewacht totdat de taak is voltooid of de wachttijd is overschreden.
Get-AzHDInsightJobOutput Wordt gebruikt om de uitvoer van de taak op te halen.

De volgende stappen laten zien hoe u deze cmdlets gebruikt om een taak uit te voeren in uw HDInsight-cluster.

  1. Sla met behulp van een editor de volgende code op alsmapreducejob.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. Open een nieuwe Azure PowerShell opdrachtprompt. Wijzig de mappen in de locatie van het mapreducejob.ps1-bestand en gebruik vervolgens de volgende opdracht om het script uit te voeren:

    .\mapreducejob.ps1
    

    Wanneer u het script uitvoert, wordt u gevraagd om de naam van het HDInsight-cluster en de aanmelding bij het cluster. Mogelijk wordt u ook gevraagd om te verifiëren bij uw Azure-abonnement.

  3. Wanneer de taak is voltooid, ontvangt u uitvoer die lijkt op de volgende tekst:

    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
    

    Deze uitvoer geeft aan dat de taak is voltooid.

    Notitie

    Als exitcode een andere waarde is dan 0, raadpleegt u Probleemoplossing.

    In dit voorbeeld worden de gedownloade bestanden ook opgeslagen in een output.txt-bestand in de map van waaruit u het script uitvoert.

Uitvoer weergeven

Als u de woorden en aantallen wilt zien die door de taak worden geproduceerd, opent u het bestandoutput.txt in een teksteditor.

Notitie

De uitvoerbestanden van een MapReduce-taak zijn onveranderbaar. Dus als u dit voorbeeld opnieuw uitvoert, moet u de naam van het uitvoerbestand wijzigen.

Problemen oplossen

Als er geen informatie wordt geretourneerd wanneer de taak is voltooid, bekijkt u fouten voor de taak. Als u foutinformatie voor deze taak wilt weergeven, voegt u de volgende opdracht toe aan het einde van het mapreducejob.ps1-bestand . Sla het bestand vervolgens op en voer het script opnieuw uit.

# 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

Deze cmdlet retourneert de informatie die naar STDERR is geschreven terwijl de taak wordt uitgevoerd.

Volgende stappen

Zoals u ziet, biedt Azure PowerShell een eenvoudige manier om MapReduce-taken uit te voeren op een HDInsight-cluster, de taakstatus te bewaken en de uitvoer op te halen. Voor informatie over andere manieren waarop u met Hadoop in HDInsight kunt werken: