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
Un cluster Apache Hadoop in HDInsight. Vedere Guida introduttiva: Introduzione ad Apache Hadoop e Apache Hive in Azure HDInsight usando il modello di Resource Manager.
Un client REST. Questo documento usa Invoke-WebRequest in Windows PowerShell e Curl in Bash.
Se si usa Bash, è necessario anche jq, un processore JSON a riga di comando. Vedere https://stedolan.github.io/jq/.
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
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.
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"}
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.
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.
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 directoryexample/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.