Executar consultas do Apache Hive com o Apache Hadoop no HDInsight com REST

Saiba como utilizar a API REST WebHCat para executar consultas do Apache Hive com o Apache Hadoop no cluster do Azure HDInsight.

Pré-requisitos

URI Base para API REST

O URI (Uniform Resource Identifier) base para a API REST no HDInsight é https://CLUSTERNAME.azurehdinsight.net/api/v1/clusters/CLUSTERNAME, onde CLUSTERNAME é o nome do cluster. Os nomes dos clusters em URIs são sensíveis a maiúsculas e minúsculas. Embora o nome do cluster na parte do nome de domínio completamente qualificado (FQDN) do URI (CLUSTERNAME.azurehdinsight.net) não seja sensível a maiúsculas e minúsculas, outras ocorrências no URI são sensíveis a maiúsculas e minúsculas.

Autenticação

Ao utilizar o cURL ou qualquer outra comunicação REST com o WebHCat, tem de autenticar os pedidos ao fornecer o nome de utilizador e a palavra-passe do administrador do cluster do HDInsight. A API de REST está protegida por autenticação básica. Para ajudar a garantir que as suas credenciais são enviadas de forma segura para o servidor, faça sempre pedidos com HTTP (HTTPS) Seguro.

Configuração (Preservar credenciais)

Preserve as suas credenciais para evitar reintroduzi-las para cada exemplo. O nome do cluster será preservado num passo separado.

A. Bash
Edite o script abaixo ao substituir PASSWORD pela palavra-passe real. Em seguida, introduza o comando .

export PASSWORD='PASSWORD'

B. PowerShell Execute o código abaixo e introduza as suas credenciais na janela de pop-up:

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

Identificar o nome do cluster corretamente maiúsculas e minúsculas

O invólucro real do nome do cluster pode ser diferente do esperado, consoante a forma como o cluster foi criado. Os passos aqui irão mostrar o invólucro real e, em seguida, armazená-lo numa variável para todos os exemplos posteriores.

Edite os scripts abaixo para substituir CLUSTERNAME pelo nome do cluster. Em seguida, introduza o comando . (O nome do cluster do FQDN não é sensível a maiúsculas e minúsculas.)

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

Executar uma consulta do Hive

  1. Para verificar se consegue ligar ao cluster do HDInsight, utilize um dos seguintes comandos:

    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
    

    Recebe uma resposta semelhante ao seguinte texto:

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

    Os parâmetros utilizados neste comando são os seguintes:

    • -u - O nome de utilizador e a palavra-passe utilizados para autenticar o pedido.
    • -G - Indica que este pedido é uma operação GET.
  2. O início do URL, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, é o mesmo para todos os pedidos. O caminho, /status, indica que o pedido é devolver um estado de WebHCat (também conhecido como Templeton) para o servidor. Também pode pedir a versão do Hive com o seguinte 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
    

    Este pedido devolve uma resposta semelhante ao seguinte texto:

    {"module":"hive","version":"1.2.1000.2.6.5.3008-11"}
    
  3. Utilize o seguinte para criar uma tabela com o nome 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
    

    Este pedido utiliza o método POST, que envia dados como parte do pedido para a API REST. Os seguintes valores de dados são enviados com o pedido:

    • user.name - O utilizador que está a executar o comando.
    • execute - As instruções do HiveQL a executar.
    • statusdir - O diretório no qual o estado desta tarefa é escrito.

    Estas instruções executam as seguintes ações:

    • DROP TABLE - Se a tabela já existir, esta será eliminada.

    • CREATE EXTERNAL TABLE - Cria uma nova tabela "externa" no Hive. As tabelas externas armazenam apenas a definição de tabela no Hive. Os dados são deixados na localização original.

      Nota

      As tabelas externas devem ser utilizadas quando espera que os dados subjacentes sejam atualizados por uma origem externa. Por exemplo, um processo automatizado de carregamento de dados ou outra operação mapReduce.

      Remover uma tabela externa não elimina os dados, apenas a definição da tabela.

    • ROW FORMAT - Como os dados são formatados. Os campos em cada registo são separados por um espaço.

    • STORED AS TEXTFILE LOCATION - Onde os dados são armazenados (o diretório de exemplo/dados) e que são armazenados como texto.

    • SELECT - Seleciona uma contagem de todas as linhas em que a coluna t4 contém o valor [ERRO]. Esta instrução devolve um valor de 3 , uma vez que existem três linhas que contêm este valor.

      Nota

      Tenha em atenção que os espaços entre as instruções hiveQL são substituídos pelo + caráter quando utilizado com Curl. Os valores citados que contêm um espaço, como o delimitador, não devem ser substituídos por +.

      Este comando devolve um ID de tarefa que pode ser utilizado para verificar o estado da tarefa.

  4. Para verificar o estado da tarefa, utilize o seguinte 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 a tarefa tiver sido concluída, o estado será BEM-sucedido.

  5. Assim que o estado da tarefa for alterado para SUCCEEDED, pode obter os resultados da tarefa a partir do armazenamento de Blobs do Azure. O statusdir parâmetro transmitido com a consulta contém a localização do ficheiro de saída; neste caso, /example/rest. Este endereço armazena a saída no example/curl diretório no armazenamento predefinido dos clusters.

    Pode listar e transferir estes ficheiros com a CLI do Azure. Para obter mais informações sobre como utilizar a CLI do Azure com o Armazenamento do Azure, veja o documento Utilizar a CLI do Azure com o Armazenamento do Azure .

Passos seguintes

Para obter informações sobre outras formas de trabalhar com o Hadoop no HDInsight:

Para obter mais informações sobre a API REST utilizada neste documento, veja o documento de referência WebHCat .