Ejecución de trabajos de MapReduce con Apache Hadoop en HDInsight con PowerShell
Este documento proporciona un ejemplo de uso de Azure PowerShell para ejecutar un trabajo de MapReduce en un Hadoop de un clúster de HDInsight.
Prerrequisitos
Un clúster de Apache Hadoop en HDInsight. Consulte Creación de clústeres de Apache Hadoop mediante Azure Portal.
Instalación del módulo Az de PowerShell.
Ejecución de un trabajo de MapReduce
Azure PowerShell proporciona cmdlets que le permiten ejecutar de manera remota trabajos de MapReduce en HDInsight. Internamente, PowerShell hace llamadas de REST a un objeto WebHCat (anteriormente llamado Templeton) que se ejecuta en el clúster de HDInsight.
Los siguientes cmdlets se utilizan al ejecutar trabajos de MapReduce en un clúster de HDInsight remoto.
Cmdlet | Descripción |
---|---|
Connect-AzAccount | autentica a Azure PowerShell en la suscripción de Azure. |
New-AzHDInsightMapReduceJobDefinition | crea una definición de trabajo mediante la información especificada de MapReduce. |
Start-AzHDInsightJob | envía la definición del trabajo a HDInsight e inicia el trabajo. Se devuelve un objeto job. |
Wait-AzHDInsightJob | usa el objeto del trabajo para comprobar el estado del trabajo. Esperará hasta que el trabajo se complete o se supere el tiempo de espera. |
Get-AzHDInsightJobOutput | se utiliza para recuperar la salida del trabajo. |
Los pasos siguientes muestran cómo usar estos cmdlets para ejecutar un trabajo en el clúster de HDInsight.
Mediante un editor, guarde el código siguiente 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 un nuevo símbolo del sistema de Azure PowerShell . Cambie los directorios a la ubicación del archivo mapreducejob.ps1 y, a continuación, utilice el siguiente comando para ejecutar el script:
.\mapreducejob.ps1
Si ejecuta el script, se le pedirá el nombre del clúster de HDInsight y el inicio de sesión del clúster. Puede que también se le pida que autentique su suscripción de Azure.
Cuando se complete el trabajo, obtendrá un texto similar al siguiente:
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
Esto indica que el trabajo se ha completado correctamente.
Nota:
Si ExitCode es un valor distinto de 0, consulte Solución de problemas.
En este ejemplo también se almacenarán los archivos descargados en el archivo output.txt, en el directorio desde el que se ejecuta el script.
Ver salida
Para ver las palabras y los recuentos generados por el trabajo, abra el archivo output.txt en un editor de texto.
Nota:
Los archivos de salida de un trabajo de MapReduce no se pueden mover. Por lo tanto, si vuelve a ejecutar esta muestra, debe cambiar el nombre del archivo de salida.
Solución de problemas
Si una vez completado el trabajo no se devuelve información, consulte los errores del trabajo. Para ver información de error de este trabajo, agregue el siguiente comando al final del archivo mapreducejob.ps1. Después, guarde el archivo y vuelva a ejecutar el 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 devuelve la información que se escribió en STDERR mientras se ejecutaba el trabajo.
Pasos siguientes
Como puede ver, Azure PowerShell proporciona una manera fácil de ejecutar trabajos de MapReduce en un clúster de HDInsight, de supervisar el estado del trabajo y de recuperar el resultado. Para obtener información sobre otras maneras de trabajar con Hadoop en HDInsight: