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

Bas-URI för REST API

Bas-URI (Uniform Resource Identifier) för REST API på 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ägesokänsligt, men andra förekomster i URI:n är skiftlägeskänsliga.

Autentisering

När du använder cURL eller någon 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 på ett säkert sätt till servern, gör 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 namnet på ett korrekt skiftlägeskluster

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

  1. Kontrollera att du kan ansluta till HDInsight-klustret med 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.
  2. Början av URL:en, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, är densamma för alla begäranden. Sökvägen , /statusanger att begäran är att returnera en status för 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"}
    
  3. 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-instruktioner 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.

      Anteckning

      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 bara tabelldefinitionen.

    • ROW FORMAT – Hur data formateras. Fälten i varje logg avgränsas med ett blanksteg.

    • STORED AS TEXTFILE LOCATION – Där data lagras (exemplet/datakatalogen) och att de lagras som text.

    • SELECT – Väljer 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.

      Anteckning

      Observera att blankstegen mellan HiveQL-instruktioner 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 av +.

      Det här kommandot returnerar ett jobb-ID som kan användas för att kontrollera jobbets status.

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

  5. När jobbets tillstånd har ändrats till SUCCEEDED kan du hämta resultatet av jobbet från Azure Blob Storage. Parametern statusdir som skickas med frågan innehåller platsen för utdatafilen. I det här fallet /example/rest. Den här adressen lagrar utdata i example/curl katalogen i klustrets standardlagring.

    Du kan lista och ladda ned dessa filer med hjälp av Azure CLI. Mer information om hur du använder Azure CLI med Azure Storage finns i dokumentet 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 .