Executar consultas do Apache Hive usando o PowerShell

Este documento fornece um exemplo do uso do Azure PowerShell para executar consultar do Apache Hive em um Apache Hadoop no cluster HDInsight.

Observação

Esse documento não fornece uma descrição detalhada do que as instruções HiveQL que usadas nos exemplos fazem. Para obter informações sobre o HiveQL usado neste exemplo, veja Usar o Apache Hive com o Apache Hadoop no HDInsight.

Pré-requisitos

Executar um trabalho do Hive

O PowerShell do Azure fornece cmdlets que lhe permitem executar remotamente as consultas Hive no HDInsight. Internamente, os cmdlets fazem chamadas REST a WebHCat no cluster HDInsight.

Os cmdlets a seguir são usados ao executar consultas do Hive em um cluster HDInsight remoto:

  • Connect-AzAccount: autentica o Azure PowerShell para a sua assinatura do Azure.
  • New-AzHDInsightHiveJobDefinition: cria uma definição de trabalho usando as instruções HiveQL especificadas.
  • Start-AzHDInsightJob: envia a definição do trabalho para HDInsight e inicia o trabalho. Um objeto job é retornado.
  • Wait-AzHDInsightJob: usa o objeto de trabalho para verificar o status do trabalho. Ele aguarda até que o trabalho seja concluído ou o tempo de espera seja excedido.
  • Get-AzHDInsightJobOutput: usado para recuperar a saída do trabalho.
  • Invoke-AzHDInsightHiveJob: usado para executar instruções de HiveQL. Esse cmdlet bloqueia a consulta até que ela seja concluída e, em seguida, retorna os resultados.
  • Use-AzHDInsightCluster: define o cluster atual para usar o comando Invoke-AzHDInsightHiveJob.

As etapas a seguir demonstram como usar esses cmdlets para executar um trabalho no seu cluster HDInsight:

  1. Usando um editor, salve o código a seguir como 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. Abra um novo prompt de comando do PowerShell do Azure . Altere os diretórios para o local do arquivo hivejob.ps1 e use o seguinte comando para executar o script:

    .\hivejob.ps1
    

    Quando o script é executado, você é solicitado a inserir o nome do cluster e as credenciais da conta de administrador de HTTPS/Cluster. Também receberá uma solicitação para se conectar à sua assinatura do Azure.

  3. Quando o trabalho for concluído, ele deverá retornar informações semelhantes ao seguinte texto:

    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. Como mencionado anteriormente, Invoke-Hive pode ser usado para executar uma consulta e aguardar a resposta. Use o script a seguir para ver como funciona o 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
    

    A saída se parece com o seguinte texto:

    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
    

    Observação

    Para consultas HiveQL mais longas, é possível usar o cmdlet Here-Strings do PowerShell do Azure ou arquivos de script HiveQL. O snippet a seguir mostram como usar o cmdlet Invoke-Hive para executar um arquivo de script HiveQL. O arquivo de script HiveQL deve ser carregado em wasbs://.

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

    Para obter mais informações sobre as Here-Strings, consulte HERE-STRINGS.

Solução de problemas

Se nenhuma informação for retornada quando o trabalho for concluído, exiba os logs de erro. Para exibir informações de erro para esse trabalho, adicione o seguinte ao final do arquivo hivejob.ps1, salve-o e execute-o novamente.

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

Esse cmdlet retorna as informações gravadas em STDERR durante o processamento do trabalho.

Resumo

Como você pode ver, o PowerShell do Azure fornece uma maneira fácil de executar consultas do Hive em um cluster HDInsight, monitorar o status do trabalho e recuperar a saída.

Próximas etapas

Para obter informações gerais sobre o Hive no HDInsight:

Para obter informações sobre outros modos possíveis de trabalhar com Hadoop no HDInsight: