Eseguire query Apache Hive usando PowerShell

Questo documento fornisce un esempio di uso di Azure PowerShell per eseguire query Apache Hive in un cluster Apache Hadoop in HDInsight.

Nota

Questo documento non fornisce una descrizione dettagliata delle operazioni eseguite dalle istruzioni HiveQL usate negli esempi. Per informazioni sul codice HiveQL usato in questo esempio, vedere Usare Apache Hive con Apache Hadoop in HDInsight.

Prerequisiti

Eseguire una query Hive

Azure PowerShell fornisce cmdlet che consentono di eseguire in modalità remota query Hive in HDInsight. I cmdlet effettuano internamente chiamate REST a WebHCat sul cluster HDInsight.

Durante l'esecuzione di query Hive in un cluster HDInsight remoto, vengono usati i seguenti cmdlet:

  • Connect-AzAccount: esegue l'autenticazione di Azure PowerShell nella sottoscrizione di Azure.
  • New-AzHDInsightHiveJobDefinition: crea una definizione del processo usando le istruzioni HiveQL specificate.
  • Start-AzHDInsightJob: invia la definizione del processo ad HDInsight e avvia il processo. Viene restituito un oggetto del processo.
  • Wait-AzHDInsightJob: usa l'oggetto processo per verificare lo stato del processo. Attende che il processo venga completato o che scada il periodo di attesa previsto.
  • Get-AzHDInsightJobOutput: usato per recuperare l'output del processo.
  • Invoke-AzHDInsightHiveJob: usato per eseguire le istruzioni HiveQL. Questo cmdlet blocca il completamento della query, quindi restituisce i risultati.
  • Use-AzHDInsightCluster: imposta il cluster corrente da usare per il comando Invoke-AzHDInsightHiveJob.

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

  1. Usando un editor salvare il codice seguente come 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. Quindi, aprire un nuovo prompt dei comandi di Azure PowerShell . Passare alla directory del file hivejob.ps1 e quindi usare il comando seguente per eseguire lo script:

    .\hivejob.ps1
    

    Quando viene eseguito lo script, viene richiesto di immettere il nome del cluster e le credenziali dell'account https/cluster Amministrazione. Potrebbe anche essere richiesto di accedere alla sottoscrizione di Azure.

  3. Al termine, il processo restituisce informazioni simili al testo seguente:

    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. Come accennato in precedenza, è possibile usare Invoke-Hive per eseguire una query e attendere la risposta. Usare lo script seguente per verificare il funzionamento di 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
    

    L'output ha un aspetto simile al testo seguente:

    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
    

    Nota

    Per query HiveQL più lunghe, è possibile usare il cmdlet Here-Strings di Azure PowerShell o un file di script HiveQL. Il frammento di codice seguente illustra come usare il cmdlet Invoke-Hive per eseguire un file di script HiveQL. Il file di script HiveQL deve essere caricato in wasb://.

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

    Per altre informazioni su Here-Strings, vedere HERE-STRINGS.

Risoluzione dei problemi

Se al termine del processo non viene restituita alcuna informazione, visualizzare i log degli errori. Per visualizzare le informazioni sugli errori relative a questo processo, aggiungere il codice seguente alla fine del file hivejob.ps1, salvare il file e quindi eseguirlo nuovamente.

# Print the output of the Hive job.
Get-AzHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $job.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 query Hive in un cluster HDInsight, monitorare lo stato del processo e recuperare l'output.

Passaggi successivi

Per informazioni generali su Hive in HDInsight:

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