Выполнение запросов Apache Hive с помощью PowerShell

Этот документ содержит пример использования Azure PowerShell выполнения запросов Apache Hive в кластере Apache Hadoop в HDInsight.

Примечание

В этом документе не приводится подробное описание процессов, которые выполняют инструкции HiveQL, используемые в примерах. Информацию об операторах HiveQL, используемых в этом примере, см. в статье Обзор Apache Hive и HiveQL в Azure HDInsight.

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

Выполнение запроса Hive

Azure PowerShell предоставляет командлеты , позволяющие удаленно запускать запросы Hive в HDInsight. Во внутренних командлет использует вызовы REST к WebHCat в кластере HDInsight.

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

  • Connect-AzAccount — выполняет аутентификацию Azure PowerShell для подписки Azure.
  • New-AzHDInsightHiveJobDefinition — создает определение задания с использованием заданных операторов HiveQL.
  • Start-AzHDInsightJob — отправляет определение задания в HDInsight и запускает задание. Будет возвращен объект задания.
  • Wait-AzHDInsightJob — использует объект-задание для проверки состояния задания. Он ожидает завершения задания или превышения времени ожидания.
  • Get-AzHDInsightJobOutput — используется для получения выходных данных задания.
  • Invoke-AzHDInsightHiveJob — используется для выполнения операторов HiveQL. Этот командлет блокирует выполнение запроса, после чего возвращаются результаты.
  • Use-AzHDInsightCluster — указывает, что при выполнении команды Invoke-AzHDInsightHiveJob должен использоваться текущий кластер.

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

  1. С помощью редактора сохраните следующий код как hivejob.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"
    
    #HiveQL
    #Note: set hive.execution.engine=tez; is not required for
    #      Linux-based HDInsight
    $queryString = "set hive.execution.engine=tez;" +
                "DROP TABLE log4jLogs;" +
                "CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION 'wasbs:///example/data/';" +
                "SELECT * FROM log4jLogs WHERE t4 = '[ERROR]';"
    
    #Create an HDInsight Hive job definition
    $hiveJobDefinition = New-AzHDInsightHiveJobDefinition -Query $queryString 
    
    #Submit the job to the cluster
    Write-Host "Start the Hive job..." -ForegroundColor Green
    
    $hiveJob = Start-AzHDInsightJob -ClusterName $clusterName -JobDefinition $hiveJobDefinition -ClusterCredential $creds
    
    #Wait for the Hive job to complete
    Write-Host "Wait for the job to complete..." -ForegroundColor Green
    Wait-AzHDInsightJob -ClusterName $clusterName -JobId $hiveJob.JobId -ClusterCredential $creds
    
    # Print the output
    Write-Host "Display the standard output..." -ForegroundColor Green
    Get-AzHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $hiveJob.JobId `
        -HttpCredential $creds
    
  2. Откройте новую командную строку Azure PowerShell . Перейдите к расположению файла hivejob.ps1, а затем используйте следующую команду для запуска скрипта:

    .\hivejob.ps1
    

    При запуске скрипта будет предложено ввести имя кластера, данные HTTPS и учетной записи администратора кластера. Вам также может быть предложено выполнить вход в свою подписку Azure.

  3. Когда задание завершается, возвращается текст следующего содержания:

    Display the standard output...
    2012-02-03      18:35:34        SampleClass0    [ERROR] incorrect       id
    2012-02-03      18:55:54        SampleClass1    [ERROR] incorrect       id
    2012-02-03      19:25:27        SampleClass4    [ERROR] incorrect       id
    
  4. Как уже упоминалось, Invoke-Hive можно использовать для отправки запроса и ожидания ответа. Чтобы увидеть работу команды Invoke-Hive, используйте следующий сценарий:

    # 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"
    
    # Set the cluster to use
    Use-AzHDInsightCluster -ClusterName $clusterName -HttpCredential $creds
    
    $queryString = "set hive.execution.engine=tez;" +
                "DROP TABLE log4jLogs;" +
                "CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/';" +
                "SELECT * FROM log4jLogs WHERE t4 = '[ERROR]';"
    Invoke-AzHDInsightHiveJob `
        -StatusFolder "statusout" `
        -Query $queryString
    

    Выходные данные выглядят так:

    2012-02-03    18:35:34    SampleClass0    [ERROR]    incorrect    id
    2012-02-03    18:55:54    SampleClass1    [ERROR]    incorrect    id
    2012-02-03    19:25:27    SampleClass4    [ERROR]    incorrect    id
    

    Примечание

    Для более длинных запросов HiveQL вы можете использовать командлет Azure PowerShell Here-Strings или файлы сценариев HiveQL. В приведенном ниже отрывке кода показано, как использовать командлет Invoke-Hive для запуска файла скрипта HiveQL. Файл сценария HiveQL необходимо передать в wasbs://.

    Invoke-AzHDInsightHiveJob -File "wasbs://<ContainerName>@<StorageAccountName>/<Path>/query.hql"

    Дополнительные сведения о строках here см в этом разделе.

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

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

# Print the output of the Hive job.
Get-AzHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $job.JobId `
        -HttpCredential $creds `
        -DisplayOutputType StandardError

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

Сводка

Как можно видеть, Azure PowerShell позволяет с легкостью выполнять запросы Hive в кластере HDInsight, отслеживать состояние задания и получать выходные данные.

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

Общая информация о Hive в HDInsight:

Дополнительная информация о других способах работы с Hadoop в HDInsight: