Partilhar via


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

Saiba como usar a API REST do 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 de cluster em URIs diferenciam maiúsculas de minúsculas. Embora o nome do cluster na parte FQDN (nome de domínio totalmente qualificado) do URI (CLUSTERNAME.azurehdinsight.net) não diferencie maiúsculas de minúsculas, outras ocorrências no URI diferenciam maiúsculas de minúsculas.

Autenticação

Ao usar cURL ou qualquer outra comunicação REST com WebHCat, você deve autenticar as solicitações fornecendo o nome de usuário e a senha para o administrador do cluster HDInsight. A API de REST está protegida por autenticação básica. Para ajudar a garantir que suas credenciais sejam enviadas com segurança para o servidor, sempre faça solicitações usando HTTP seguro (HTTPS).

Configuração (Preservar credenciais)

Preserve suas credenciais para evitar reinseri-las para cada exemplo. O nome do cluster será preservado em uma etapa separada.

A. Bash
Edite o script abaixo substituindo PASSWORD pela sua senha real. Em seguida, digite o comando.

export PASSWORD='PASSWORD'

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

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

Identificar corretamente o nome do cluster com caixa

O invólucro real do nome do cluster pode ser diferente do esperado, dependendo de como o cluster foi criado. As etapas aqui mostrarão o invólucro real e, em seguida, armazená-lo-ão em uma variável para todos os exemplos posteriores.

Edite os scripts abaixo para substituir CLUSTERNAME pelo nome do cluster. Em seguida, digite o comando. (O nome do cluster para o FQDN não diferencia maiúsculas de 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 você pode se conectar ao cluster HDInsight, use 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
    

    Você 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 esta solicitação é uma operação GET.
  2. O início do URL, https://$CLUSTERNAME.azurehdinsight.net/templeton/v1, é o mesmo para todas as solicitações. O caminho, /status, indica que a solicitação é retornar um status de WebHCat (também conhecido como Templeton) para o servidor. Você também pode solicitar a versão do Hive usando 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
    

    Esta solicitação retorna uma resposta semelhante ao seguinte texto:

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

    Essa solicitação usa o método POST, que envia dados como parte da solicitação para a API REST. Os seguintes valores de dados são enviados com a solicitação:

    • user.name - O usuário que está executando o comando.
    • execute - As instruções HiveQL a serem executadas.
    • statusdir - O diretório no qual o status para este trabalho é gravado.

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

    • DROP TABLE - Se a tabela já existir, ela será excluída.

    • 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 no local original.

      Nota

      As tabelas externas devem ser usadas quando você espera que os dados subjacentes sejam atualizados por uma fonte externa. Por exemplo, um processo automatizado de upload de dados ou outra operação MapReduce.

      Soltar uma tabela externa não exclui os dados, apenas a definição da tabela.

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

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

    • SELECT - Seleciona uma contagem de todas as linhas onde a coluna t4 contém o valor [ERROR]. Esta instrução retorna um valor de 3 , pois há três linhas que contêm esse valor.

      Nota

      Observe que os espaços entre as instruções HiveQL são substituídos + pelo caractere quando usado com Curl. Os valores entre aspas que contêm um espaço, como o delimitador, não devem ser substituídos por +.

      Este comando retorna uma ID de trabalho que pode ser usada para verificar o status do trabalho.

  4. Para verificar o status do trabalho, use 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 o trabalho tiver terminado, o estado será BEM-SUCEDIDO.

  5. Depois que o estado do trabalho for alterado para SUCCEEDED, você poderá recuperar os resultados do trabalho do armazenamento de Blob do Azure. O statusdir parâmetro passado com a consulta contém o local do arquivo de saída, neste caso, /example/rest. Esse endereço armazena a example/curl saída no diretório no armazenamento padrão dos clusters.

    Você pode listar e baixar esses arquivos usando a CLI do Azure. Para obter mais informações, consulte Usar a CLI do Azure com o Armazenamento do Azure.

Próximos passos

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

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