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
Um cluster do Apache Hadoop no HDInsight. Veja Criar clusters do Apache Hadoop com o portal do Azure.
O Módulo do Az do PowerShell instalado.
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.
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
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.
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: