Köra Apache Hive-frågor med Apache Hadoop i HDInsight med HJÄLP av REST
Lär dig hur du använder WebHCat REST API för att köra Apache Hive-frågor med Apache Hadoop i Azure HDInsight-kluster.
Förutsättningar
Ett Apache Hadoop-kluster i HDInsight. Se Komma igång med HDInsight i Linux.
En REST-klient. Det här dokumentet använder Invoke-WebRequest i Windows PowerShell och Curl på Bash.
Om du använder Bash behöver du även jq, en JSON-processor på kommandoraden. Se https://stedolan.github.io/jq/.
Bas-URI för REST API
Bas-URI (Uniform Resource Identifier) för REST-API:et i HDInsight är https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME
, där CLUSTERNAME
är namnet på klustret. Klusternamn i URI:er är skiftlägeskänsliga. Klusternamnet i den fullständigt kvalificerade domännamnsdelen (FQDN) i URI:n (CLUSTERNAME.azurehdinsight.net
) är skiftlägeskänslig, men andra förekomster i URI:n är skiftlägeskänsliga.
Autentisering
När du använder cURL eller annan REST-kommunikation med WebHCat måste du autentisera begäranden genom att ange användarnamnet och lösenordet för HDInsight-klusteradministratören. REST API skyddas via grundläggande autentisering. För att säkerställa att dina autentiseringsuppgifter skickas säkert till servern gör du alltid begäranden med hjälp av Säker HTTP (HTTPS).
Installation (Bevara autentiseringsuppgifter)
Behåll dina autentiseringsuppgifter för att undvika att ange dem igen för varje exempel. Klusternamnet bevaras i ett separat steg.
A. Bash
Redigera skriptet nedan genom att PASSWORD
ersätta med ditt faktiska lösenord. Ange sedan kommandot .
export PASSWORD='PASSWORD'
B. PowerShell Kör koden nedan och ange dina autentiseringsuppgifter i popup-fönstret:
$creds = Get-Credential -UserName "admin" -Message "Enter the HDInsight login"
Identifiera ett korrekt skiftlägesklusternamn
Det faktiska höljet för klusternamnet kan skilja sig från förväntat, beroende på hur klustret skapades. Stegen här visar det faktiska höljet och lagrar det sedan i en variabel för alla senare exempel.
Redigera skripten nedan för att ersätta CLUSTERNAME
med ditt klusternamn. Ange sedan kommandot . (Klusternamnet för FQDN är inte skiftlägeskänsligt.)
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
Köra en Hive-fråga
Om du vill kontrollera att du kan ansluta till ditt HDInsight-kluster använder du något av följande kommandon:
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
Du får ett svar som liknar följande text:
{"status":"ok","version":"v1"}
De parametrar som används i det här kommandot är följande:
-u
– Användarnamnet och lösenordet som används för att autentisera begäran.-G
– Anger att den här begäran är en GET-åtgärd.
Början av URL:en,
https://$CLUSTERNAME.azurehdinsight.net/templeton/v1
, är densamma för alla begäranden. Sökvägen ,/status
anger att begäran är att returnera statusen WebHCat (kallas även Templeton) för servern. Du kan också begära versionen av Hive med hjälp av följande kommando: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
Den här begäran returnerar ett svar som liknar följande text:
{"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
Använd följande för att skapa en tabell med namnet 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
Den här begäran använder POST-metoden, som skickar data som en del av begäran till REST-API:et. Följande datavärden skickas med begäran:
user.name
– Den användare som kör kommandot.execute
– HiveQL-uttryck som ska köras.statusdir
– Den katalog som statusen för det här jobbet skrivs till.
Dessa instruktioner utför följande åtgärder:
DROP TABLE
– Om tabellen redan finns tas den bort.CREATE EXTERNAL TABLE
– Skapar en ny extern tabell i Hive. Externa tabeller lagrar endast tabelldefinitionen i Hive. Data finns kvar på den ursprungliga platsen.Kommentar
Externa tabeller bör användas när du förväntar dig att underliggande data ska uppdateras av en extern källa. Till exempel en automatiserad datauppladdningsprocess eller en annan MapReduce-åtgärd.
Om du tar bort en extern tabell tas inte data bort, utan endast tabelldefinitionen.
ROW FORMAT
– Hur data formateras. Fälten i varje logg avgränsas med ett blanksteg.STORED AS TEXTFILE LOCATION
– Var data lagras (exemplet/datakatalogen) och att de lagras som text.SELECT
– Markerar ett antal av alla rader där kolumn t4 innehåller värdet [ERROR]. Den här instruktionen returnerar värdet 3 eftersom det finns tre rader som innehåller det här värdet.Kommentar
Observera att blankstegen mellan HiveQL-uttryck ersätts med tecknet när de
+
används med Curl. Angivna värden som innehåller ett blanksteg, till exempel avgränsare, bör inte ersättas med+
.Det här kommandot returnerar ett jobb-ID som kan användas för att kontrollera jobbets status.
Om du vill kontrollera jobbets status använder du följande kommando:
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
Om jobbet har slutförts är tillståndet LYCKADES.
När jobbets tillstånd har ändrats till SUCCEEDED kan du hämta resultatet av jobbet från Azure Blob Storage. Parametern
statusdir
som skickades med frågan innehåller platsen för utdatafilen. I det här fallet/example/rest
. Den här adressen lagrar utdata iexample/curl
katalogen i klusterstandardlagringen.Du kan lista och ladda ned dessa filer med hjälp av Azure CLI. Mer information finns i Använda Azure CLI med Azure Storage.
Nästa steg
Information om andra sätt att arbeta med Hadoop på HDInsight:
Mer information om REST-API:et som används i det här dokumentet finns i WebHCat-referensdokumentet .