Condividi tramite


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'Uniform Resource Identifier (URI) di base per l'API REST in HDInsight è https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, dove CLUSTERNAME è il nome del cluster in uso. Per i nomi del cluster negli URI viene fatta distinzione tra maiuscole e minuscole. A differenza delle altre occorrenze nell'URI, nel nome del cluster nella parte del nome di dominio completo (FQDN) dell'URI (CLUSTERNAME.azurehdinsight.net) non viene fatta distinzione tra maiuscole e minuscole.

Autenticazione

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).

Configurazione (conservare le credenziali)

Conservare le credenziali per evitare di inserirle nuovamente per ogni esempio. Il nome del cluster verrà conservato in un passaggio separato.

R. Bash
Modificare lo script sottostante sostituendo PASSWORD con la password effettiva. Quindi immettere il comando.

export PASSWORD='PASSWORD'

B. PowerShell Eseguire il codice sottostante e inserire le credenziali nella finestra popup:

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

Identificare il nome del cluster con l'uso corretto di 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. I passaggi qui riportati mostreranno l'effettivo uso delle maiuscole e minuscole, per poi memorizzarle in una variabile per tutti gli esempi successivi.

Modificare gli script sottostanti sostituendo CLUSTERNAME con il nome del cluster. Quindi immettere il comando. (Il nome del cluster per il FQDN non fa 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: indica la posizione in cui sono archiviati i dati (la directory example/data) e che sono 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, vedere Uso dell'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.