Eseguire query Apache Hive con Apache Hadoop in HDInsight tramite REST

Informazioni su come usare l'API REST WebHCat per eseguire query Apache Hive con Apache Hadoop nel cluster Azure HDInsight.

Prerequisiti

URI di base per l'API REST

L'URI (Uniform Resource Identifier) di base per l'API REST in HDInsight è https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, dove CLUSTERNAME è il nome del cluster. I nomi dei cluster negli URI sono distinzione tra maiuscole e minuscole. Mentre il nome del cluster nella parte FQDN (nome di dominio completo) della parte URI (CLUSTERNAME.azurehdinsight.net) è senza distinzione tra maiuscole e minuscole, altre occorrenze nell'URI sono distinzione tra maiuscole e minuscole.

Authentication

Quando si usa Curl o qualsiasi altra forma di comunicazione REST con WebHCat, è necessario autenticare le richieste fornendo il nome utente e la password dell'amministratore cluster HDInsight. L'API REST viene protetta tramite l' autenticazione di base. Per essere certi che le credenziali vengano inviate in modo sicuro al server, eseguire sempre le richieste usando il protocollo Secure HTTP (HTTPS).

Installazione (Mantieni le credenziali)

Mantenere le credenziali per evitare di immetterle per ogni esempio. Il nome del cluster verrà mantenuto in un passaggio separato.

A. Bash
Modificare lo script seguente sostituendo PASSWORD con la password effettiva. Immettere quindi il comando.

export PASSWORD='PASSWORD'

B. PowerShell Eseguire il codice seguente e immettere le credenziali nella finestra popup:

$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"

Identificare correttamente il nome del cluster con maiuscole e minuscole

L'uso effettivo di maiuscole e minuscole nel nome del cluster può differire dal previsto, a seconda della modalità di creazione del cluster. La procedura seguente mostra le maiuscole e minuscole effettive e quindi la archivia in una variabile per tutti gli esempi successivi.

Modificare gli script seguenti per sostituire CLUSTERNAME con il nome del cluster. Immettere quindi il comando. Il nome del cluster per il nome di dominio completo non è distinzione tra maiuscole e minuscole.

export CLUSTER_NAME=$(curl -u admin:$PASSWORD -sS -G "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" | jq -r '.items[].Clusters.cluster_name')
echo $CLUSTER_NAME
# Identify properly cased cluster name
$resp = Invoke-WebRequest -Uri "https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters" `
    -Credential $creds -UseBasicParsing
$clusterName = (ConvertFrom-Json $resp.Content).items.Clusters.cluster_name;

# Show cluster name
$clusterName

Eseguire una query Hive

  1. Per verificare che sia possibile connettersi al cluster HDInsight, usare uno dei comandi seguenti:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/status
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/status" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Si riceverà un messaggio simile al testo seguente:

    {"status":"ok","version":"v1"}
    

    I parametri usati in questo comando sono i seguenti:

    • -u: il nome utente e la password usati per autenticare la richiesta.
    • -G: indica che è un'operazione GET.
  2. La parte iniziale dell'URL, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, è uguale per tutte le richieste. Il percorso, /status, indica che la richiesta deve restituire uno stato di WebHCat (noto anche come Templeton) per il server. È inoltre possibile richiedere la versione di Hive usando il seguente comando:

    curl -u admin:$PASSWORD -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/version/hive
    
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/version/hive" `
       -Credential $creds `
       -UseBasicParsing
    $resp.Content
    

    Questa richiesta restituisce una risposta simile al testo seguente:

    {"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
    
  3. Usare quanto segue per creare una tabella denominata log4jLogs:

    JOB_ID=$(curl -s -u admin:$PASSWORD -d user.name=admin -d execute="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+t4+AS+sev,COUNT(*)+AS+count+FROM+log4jLogs+WHERE+t4+=+'[ERROR]'+AND+INPUT__FILE__NAME+LIKE+'%25.log'+GROUP+BY+t4;" -d statusdir="/example/rest" https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/hive | jq -r .id)
    echo $JOB_ID
    
    $reqParams = @{"user.name"="admin";"execute"="DROP TABLE log4jLogs;CREATE EXTERNAL TABLE log4jLogs(t1 string, t2 string, t3 string, t4 string, t5 string, t6 string, t7 string) ROW FORMAT DELIMITED BY ' ' STORED AS TEXTFILE LOCATION '/example/data/;SELECT t4 AS sev,COUNT(*) AS count FROM log4jLogs WHERE t4 = '[ERROR]' GROUP BY t4;";"statusdir"="/example/rest"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/hive" `
       -Credential $creds `
       -Body $reqParams `
       -Method POST `
       -UseBasicParsing
    $jobID = (ConvertFrom-Json $resp.Content).id
    $jobID
    

    Questa richiesta usa il metodo POST, che invia dati come parte della richiesta all'API REST. I valori di dati seguenti vengono inviati insieme alla richiesta:

    • user.name: l'utente che esegue il comando.
    • execute: le istruzioni HiveQL da eseguire.
    • statusdir: la directory in cui è scritto lo stato del processo.

    Le istruzioni eseguono queste azioni:

    • DROP TABLE - Se la tabella esiste già, viene eliminata.

    • CREATE EXTERNAL TABLE: crea una nuova tabella "esterna" in Hive. Le tabelle esterne archiviano solo la definizione della tabella in Hive. I dati rimangono nel percorso originale.

      Nota

      Usa le tabelle esterne se si prevede che i dati sottostanti verranno aggiornati da un'origine esterna. Ad esempio, un processo di caricamento dati automatizzato o un'altra operazione MapReduce.

      L'eliminazione di una tabella esterna non comporta anche l'eliminazione dei dati. Viene eliminata solo la definizione della tabella.

    • ROW FORMAT: indica il modo in cui sono formattati i dati. I campi in ogni log sono separati da uno spazio.

    • STORED AS TEXTFILE LOCATION - Dove vengono archiviati i dati (la directory di esempio/dati) e che vengono archiviati come testo.

    • SELECT: seleziona un conteggio di tutte le righe in cui la colonna t4 include il valore [ERROR]. L'istruzione dovrebbe restituire un valore pari a 3, poiché sono presenti tre righe contenenti questo valore.

      Nota

      Si noti che gli spazi tra le istruzioni HiveQL vengono sostituiti dal carattere + se è in uso Curl. I valori tra virgolette che contengono uno spazio, ad esempio il delimitatore, non devono essere sostituiti da +.

      Questo comando resituisce un'ID del comando che può essere usata per controllare lo stato del processo.

  4. Per verificare lo stato del processo, usare il seguente comando:

    curl -u admin:$PASSWORD -d user.name=admin -G https://$CLUSTER_NAME.azurehdinsight.net/templeton/v1/jobs/$jobid | jq .status.state
    
    $reqParams=@{"user.name"="admin"}
    $resp = Invoke-WebRequest -Uri "https://$clusterName.azurehdinsight.net/templeton/v1/jobs/$jobID" `
       -Credential $creds `
       -Body $reqParams `
       -UseBasicParsing
    # ConvertFrom-JSON can't handle duplicate names with different case
    # So change one to prevent the error
    $fixDup=$resp.Content.Replace("jobID","job_ID")
    (ConvertFrom-Json $fixDup).status.state
    

    Se il processo è stato completato, lo stato è SUCCEEDED.

  5. Dopo che lo stato del processo risulta essere SUCCEEDED, è possibile recuperare i risultati del processo dall'archivio BLOB di Azure. Il parametro statusdir passato con la query contiene il percorso del file di output; in questo caso /example/rest. Questo indirizzo archivia l'output nella directory example/curl nell'archiviazione predefinita dei cluster.

    È possibile elencare e scaricare questi file usando l' Interfaccia della riga di comando di Azure. Per altre informazioni sull'uso dell'interfaccia della riga di comando di Azure con Archiviazione di Azure, vedere il documento Usa interfaccia della riga di comando di Azure con Archiviazione di Azure.

Passaggi successivi

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

Per altre informazioni sull'API REST usata in questo documento, vedere il documento Informazioni di riferimento su WebHCat.