Esecuzione di query Hive usando PowerShell

Questo documento fornisce un esempio di come usare Azure PowerShell nel gruppo di risorse Azure per eseguire query Hive in un cluster 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 Hive con Hadoop in HDInsight.

Prerequisiti

  • Un cluster Azure HDInsight: non è importante che il cluster sia basato su Windows o su Linux.

    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.

Importante

Il supporto di Azure PowerShell per la gestione delle risorse HDInsight tramite Azure Service Manager è deprecato ed è stato rimosso dal 1° gennaio 2017. La procedura descritta in questo documento usa i nuovi cmdlet HDInsight, compatibili con Azure Resource Manager.

Per installare la versione più recente, seguire la procedura descritta in Come installare e configurare Azure PowerShell . Se sono presenti script che devono essere modificati per l'uso dei nuovi cmdlet compatibili con Azure Resource Manager, per altre informazioni vedere Migrazione a strumenti di sviluppo basati su Azure Resource Manager per i cluster HDInsight .

Eseguire query Hive usando Azure PowerShell

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:

  • Add-AzureRmAccount: autentica Azure PowerShell nella sottoscrizione di Azure.
  • New-AzureRmHDInsightHiveJobDefinition: crea una definizione del processo usando le istruzioni HiveQL 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.
  • Invoke-AzureRmHDInsightHiveJob: viene usato per eseguire istruzioni HiveQL. Questo cmdlet blocca il completamento della query, quindi restituisce i risultati.
  • Use-AzureRmHDInsightCluster: imposta il cluster corrente per l'uso per il comando Invoke-AzureRmHDInsightHiveJob.

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

  1. Usando un editor, salvare il seguente codice come hivejob.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"
    
    #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-AzureRmHDInsightHiveJobDefinition -Query $queryString 
    
    #Submit the job to the cluster
    Write-Host "Start the Hive job..." -ForegroundColor Green
    
    $hiveJob = Start-AzureRmHDInsightJob -ClusterName $clusterName -JobDefinition $hiveJobDefinition -ClusterCredential $creds
    
    #Wait for the Hive job to complete
    Write-Host "Wait for the job to complete..." -ForegroundColor Green
    Wait-AzureRmHDInsightJob -ClusterName $clusterName -JobId $hiveJob.JobId -ClusterCredential $creds
    
    # Print the output
    Write-Host "Display the standard output..." -ForegroundColor Green
    Get-AzureRmHDInsightJobOutput `
        -Clustername $clusterName `
        -JobId $hiveJob.JobId `
        -HttpCredential $creds
    
  2. Quindi, aprire un nuovo prompt dei comandi di Azure PowerShell . Passare al percorso del file hivejob.ps1 , quindi usare il seguente comando per eseguire lo script:

     .\hivejob.ps1
    

    Quando viene eseguito lo script, viene richiesto di immettere il nome cluster e le credenziali dell'account HTTPS/Admin per il cluster. Può anche essere richiesto di eseguire l'accesso 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, Invoke-Hive può essere usato per eseguire una query e attendere la risposta. Usare lo script seguente per verificare il funzionamento di Invoke-Hive:

    # 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"
    
    # Set the cluster to use
    Use-AzureRmHDInsightCluster -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-AzureRmHDInsightHiveJob `
        -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. Nel frammento di codice seguente viene illustrato come usare il cmdlet Invoke-Hive per eseguire un file di script HiveQL. Il file di script HiveQL deve essere caricato in wasb://.

    Invoke-AzureRmHDInsightHiveJob -File "wasb://<ContainerName>@<StorageAccountName>/<Path>/query.hql"

    Per altre informazioni su Here-Strings, vedere Using Windows PowerShell "Here-Strings" (Uso di Here-Strings di Windows PowerShell).

Risoluzione dei problemi

Se al termine del processo non viene restituita alcuna informazione, visualizzare i log degli errori. Per visualizzare informazioni relative all'errore per questo processo, aggiungere quanto segue alla fine del file hivejob.ps1 , salvare il file, quindi eseguirlo nuovamente.

# Print the output of the Hive job.
Get-AzureRmHDInsightJobOutput `
        -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: