Выполнение заданий MapReduce с помощью PowerShell и Apache Hadoop в HDInsight

В этом документе приведен пример использования Azure PowerShell для выполнения задания MapReduce в Hadoop на кластере HDInsight.

Предварительные требования

Выполнение задания MapReduce

Azure PowerShell предоставляет командлеты , позволяющие удаленно запускать задания MapReduce в HDInsight. На внутреннем уровне PowerShell выполняет вызовы REST к WebHCat (прежнее название — Templeton) в кластере HDInsight.

При выполнении заданий MapReduce в удаленном кластере HDInsight используются следующие командлеты:

Командлет Описание
Connect-AzAccount выполняет аутентификацию Azure PowerShell для подписки Azure.
New-AzHDInsightMapReduceJobDefinition создает определение задания, используя заданную информацию MapReduce.
Start-AzHDInsightJob отправляет определение задания в HDInsight и запускает задание. Будет возвращен объект задания.
Wait-AzHDInsightJob проверяет состояние задания с помощью объекта-задания. Он ожидает завершения задания или превышения времени ожидания.
Get-AzHDInsightJobOutput используется для получения выходных данных задания.

Следующие шаги показывают, как использовать эти командлеты для выполнения задания в кластере HDInsight:

  1. С помощью редактора сохраните следующий код как 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. Откройте новую командную строку Azure PowerShell . Перейдите к расположению файла mapreducejob.ps1 , а затем используйте следующую команду для запуска сценария:

    .\mapreducejob.ps1
    

    При выполнении скрипта вам будет предложено ввести имя кластера HDInsight и имя для входа в этот кластер. Вам также может быть предложено аутентифицироваться в подписке Azure.

  3. По завершении задания выходные данные будут иметь примерно следующий вид.

    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
    

    Такие выходные данные означают, что задание завершено успешно.

    Примечание

    Если значение ExitCode не равно 0, см. сведения в разделе Устранение неполадок.

    В этом примере скачанные файлы сохраняются в файле output.txt в каталоге, из которого запускается сценарий.

Просмотр выходных данных

Чтобы просмотреть слова и статистику, полученные при выполнении задания, откройте файл output.txt в текстовом редакторе.

Примечание

Выходные файлы задания MapReduce являются неизменяемыми. Поэтому при повторном выполнении этого примера потребуется изменить имя выходного файла.

Устранение неполадок

Если при завершении задания данные не возвращаются, просмотрите ошибки задания. Чтобы просмотреть информацию об ошибке для этого задания, добавьте следующую команду в конец файла mapreducejob.ps1. Затем сохраните его и запустите скрипт снова.

# 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

Этот командлет возвращает информацию, которая записывалась в STDERR при выполнении задания.

Дальнейшие действия

Как можно видеть, Azure PowerShell позволяет с легкостью выполнять задания MapReduce в кластере HDInsight, отслеживать состояние задания и получать выходные данные. Дополнительная информация о других способах работы с Hadoop в HDInsight: