Esecuzione di processi MapReduce con Hadoop in HDInsight mediante PowerShell

Questo documento fornisce un esempio di come usare Azure PowerShell per eseguire un processo MapReduce in un cluster Hadoop in HDInsight.

Prerequisiti

  • Un cluster Azure HDInsight (Hadoop in HDInsight)

    Importante

    Linux è l'unico sistema operativo usato in HDInsight versione 3.4 o successiva. Per altre informazioni, vedere la sezione relativa al ritiro di HDInsight in Windows.

  • Workstation con Azure PowerShell.

Eseguire un processo MapReduce con Azure PowerShell

Azure PowerShell fornisce cmdlet che consentono di eseguire in modalità remota processi MapReduce in HDInsight. PowerShell effettua internamente chiamate REST a WebHCat (chiamato in precedenza Templeton) in esecuzione nel cluster HDInsight.

Durante l'esecuzione di processi MapReduce in un cluster HDInsight remoto, vengono usati i seguenti cmdlet.

  • Login-AzureRmAccount: autentica Azure PowerShell nella sottoscrizione di Azure.

  • New-AzureRmHDInsightMapReduceJobDefinition: crea una nuova definizione di processo usando le informazioni MapReduce specificate.

  • Start-AzureRmHDInsightJob: invia la definizione del processo ad HDInsight e avvia il processo. Viene restituito un oggetto del processo.

  • Wait-AzureRmHDInsightJob: usa l'oggetto job per verificare lo stato del processo. Attende che il processo venga completato o che scada il periodo di attesa previsto.

  • Get-AzureRmHDInsightJobOutput: viene usato per recuperare l'output del processo.

La seguente procedura illustra come usare questi cmdlet per eseguire un processo nel cluster HDInsight.

  1. Usando un editor, salvare il seguente codice come mapreducejob.ps1.

    # Login to your Azure subscription
    # Is there an active Azure subscription?
    $sub = Get-AzureRmSubscription -ErrorAction SilentlyContinue
    if(-not($sub))
    {
        Add-AzureRmAccount
    }
    
    # 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-AzureRmHDInsightCluster -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-AzureRmStorageAccountKey `
        -Name $storageAccountName `
    -ResourceGroupName $resourceGroup)[0].Value
    
    #Create a storage context
    $context = New-AzureStorageContext `
        -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-AzureRmHDInsightMapReduceJobDefinition `
        -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-AzureRmHDInsightJob `
        -ClusterName $clusterName `
        -JobDefinition $wordCountJobDefinition `
        -HttpCredential $creds
    
    #Wait for the job to complete
    Write-Host "Wait for the job to complete..." -ForegroundColor Green
    Wait-AzureRmHDInsightJob `
        -ClusterName $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds
    # Download the output
    Get-AzureStorageBlobContent `
        -Blob 'example/data/WordCountOutput/part-r-00000' `
        -Container $container `
        -Destination output.txt `
        -Context $context
    # Print the output of the job.
    Get-AzureRmHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds
    
  2. Quindi, aprire un nuovo prompt dei comandi di Azure PowerShell . Passare al percorso del file mapreducejob.ps1 , quindi usare il seguente comando per eseguire lo script.

     .\mapreducejob.ps1
    

    Quando si esegue lo script viene chiesto il nome del cluster HDInsight e l'account di accesso del cluster. Potrebbe anche essere richiesta l'autenticazione alla sottoscrizione di Azure.

  3. Al termine del processo, viene visualizzato un output simile al testo seguente:

     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
    

    Questo output indica che il processo è stato completato correttamente.

    Nota

    Se ExitCode è un valore diverso da 0, vedere Risoluzione dei problemi.

    Questo esempio consente anche di archiviare i file scaricati in un file output.txt nella directory in cui viene eseguito lo script.

Visualizzare l’output

Per vedere le parole e i numeri generati dal processo, aprire il file output.txt in un editor di testo.

Nota

I file di output di un processo MapReduce non sono modificabili. Se pertanto si esegue di nuovo l'esempio, è necessario cambiare il nome del file di output.

Risoluzione dei problemi

Se al termine del processo non viene restituita alcuna informazione, visualizzare gli errori relativi al processo. Per visualizzare informazioni relative all'errore per questo processo, aggiungere il seguente comando alla fine del file mapreducejob.ps1 , salvare il file, quindi eseguirlo nuovamente.

# Print the output of the WordCount job.
Write-Host "Display the standard output ..." -ForegroundColor Green
Get-AzureRmHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $wordCountJob.JobId `
        -HttpCredential $creds `
        -DisplayOutputType StandardError

Questo cmdlet restituisce le informazioni scritte in STDERR durante l'esecuzione del processo.

Riepilogo

Come è possibile notare, Azure PowerShell fornisce un modo semplice per eseguire processi MapReduce in un cluster HDInsight, monitorare lo stato del processo e recuperare l'output.

Passaggi successivi

Per informazioni generali sui processi MapReduce in HDInsight:

Per informazioni su altre modalità d'uso di Hadoop in HDInsight: