Executar tarefas do MapReduce com o Apache Hadoop no HDInsight com o PowerShell

Este documento fornece um exemplo de utilização de Azure PowerShell para executar uma tarefa do MapReduce num hadoop no cluster do HDInsight.

Pré-requisitos

Executar uma tarefa do MapReduce

Azure PowerShell fornece cmdlets que lhe permitem executar remotamente tarefas do MapReduce no HDInsight. Internamente, o PowerShell faz chamadas REST para WebHCat (anteriormente denominado Templeton) em execução no cluster do HDInsight.

Os seguintes cmdlets são utilizados ao executar tarefas do MapReduce num cluster remoto do HDInsight.

Cmdlet Descrição
Connect-AzAccount Autentica Azure PowerShell na sua subscrição do Azure.
New-AzHDInsightMapReduceJobDefinition Cria uma nova definição de tarefa com as informações especificadas do MapReduce.
Start-AzHDInsightJob Envia a definição da tarefa para o HDInsight e inicia a tarefa. É devolvido um objeto de tarefa .
Wait-AzHDInsightJob Utiliza o objeto de tarefa para verificar o estado da tarefa. Aguarda até que a tarefa seja concluída ou o tempo de espera seja excedido.
Get-AzHDInsightJobOutput Utilizado para obter a saída da tarefa.

Os passos seguintes demonstram como utilizar estes cmdlets para executar uma tarefa no cluster do HDInsight.

  1. Com um editor, guarde o seguinte código como 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. Abra uma nova linha de comandos Azure PowerShell. Altere os diretórios para a localização do ficheiro mapreducejob.ps1 e, em seguida, utilize o seguinte comando para executar o script:

    .\mapreducejob.ps1
    

    Quando executa o script, é-lhe pedido o nome do cluster do HDInsight e o início de sessão do cluster. Também poderá ser-lhe pedido que se autentique na sua subscrição do Azure.

  3. Quando a tarefa for concluída, receberá um resultado semelhante ao seguinte texto:

    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
    

    Este resultado indica que a tarefa foi concluída com êxito.

    Nota

    Se o ExitCode for um valor diferente de 0, veja Resolução de problemas.

    Este exemplo também armazena os ficheiros transferidos para um ficheiro output.txt no diretório a partir do qual executa o script.

Ver saída

Para ver as palavras e contagens produzidas pela tarefa, abra o ficheiro output.txt num editor de texto.

Nota

Os ficheiros de saída de uma tarefa do MapReduce são imutáveis. Por isso, se voltar a executar este exemplo, terá de alterar o nome do ficheiro de saída.

Resolução de problemas

Se não forem devolvidas informações quando a tarefa for concluída, veja os erros da tarefa. Para ver as informações de erro desta tarefa, adicione o seguinte comando ao final do ficheiro demapreducejob.ps1 . Em seguida, guarde o ficheiro e execute novamente o script.

# 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

Este cmdlet devolve as informações que foram escritas no STDERR à medida que a tarefa é executada.

Passos seguintes

Como pode ver, Azure PowerShell fornece uma forma fácil de executar tarefas do MapReduce num cluster do HDInsight, monitorizar o estado da tarefa e obter a saída. Para obter informações sobre outras formas de trabalhar com o Hadoop no HDInsight: