Configurar uma tabela do Hive para executar comandos do Hive - Amazon EMR

Configurar uma tabela do Hive para executar comandos do Hive

O Apache Hive é uma aplicação de data warehouse que você pode usar para consultar dados contidos em clusters do Amazon EMR usando uma linguagem semelhante ao SQL. Para obter mais informações sobre o Hive, consulte http://hive.apache.org/.

O procedimento a seguir pressupõe que você já tenha criado um cluster e especificado um par de chaves do Amazon EC2. Para saber como começar a criar clusters, consulte Getting started with Amazon EMR no Guia de gerenciamento do Amazon EMR.

Configurar o Hive para usar o MapReduce

Quando você usar o Hive no Amazon EMR para consultar tabelas do DynamoDB, poderão ocorrer erros se o Hive usar o mecanismo de execução padrão, o Tez. Por isso, ao criar um cluster com o Hive que se integre ao DynamoDB, conforme descrito nesta seção, recomendamos que você use uma classificação de configuração que defina o Hive para usar o MapReduce. Para ter mais informações, consulte Configurar aplicações.

O seguinte trecho mostra a classificação e a propriedade de configuração a serem usadas para definir o MapReduce como o mecanismo de execução para o Hive:

[ { "Classification": "hive-site", "Properties": { "hive.execution.engine": "mr" } } ]
Para executar comandos do Hive interativamente
  1. Conecte-se ao nó principal. Para obter mais informações, consulte Conectar-se ao nó principal usando SSH no Guia de gerenciamento do Amazon EMR.

  2. No prompt de comando do nó principal atual, digite hive.

    Você verá um prompt do Hive: hive>

  3. Insira um comando do Hive que mapeie uma tabela na aplicação Hive para os dados no DynamoDB. Essa tabela serve de referência para os dados armazenados no Amazon DynamoDB; os dados não são armazenados localmente no Hive, e qualquer consulta usando essa tabela é executada com base nos dados dinâmicos no DynamoDB, consumindo a capacidade de leitura ou gravação da tabela sempre que um comando é executado. Se você pretende executar vários comandos do Hive no mesmo conjunto de dados, considere exportá-lo primeiro.

    O exemplo a seguir mostra a sintaxe para mapear uma tabela do Hive para uma tabela do DynamoDB.

    CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...");

    Ao criar uma tabela no Hive pelo DynamoDB, você deve criá-la como uma tabela externa usando a palavra-chave EXTERNAL. A diferença entre tabelas externas e internas é que os dados nas tabelas internas são excluídos quando uma tabela interna é descartada. Este não é o comportamento desejado no caso de uma conexão com o Amazon DynamoDB e, portanto, somente tabelas externas são compatíveis.

    Por exemplo, o seguinte comando do Hive cria uma tabela chamada hivetable1 no Hive que referencia a tabela do DynamoDB chamada dynamodbtable1. A tabela do DynamoDB dynamodbtable1 tem um esquema de chave primária de hash e intervalo. O elemento da chave de hash é name (do tipo string), o elemento de chave de intervalo é year (do tipo numérico), e cada item possui um valor de atributo para holidays (do tipo conjunto de strings).

    CREATE EXTERNAL TABLE hivetable1 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable1", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays");

    A linha 1 usa a instrução HiveQL CREATE EXTERNAL TABLE. Para hivetable1, você precisa estabelecer uma coluna para cada par de nome-valor de atributo na tabela do DynamoDB e fornecer o tipo de dados. Esses valores não diferenciam maiúsculas de minúsculas, e você pode dar qualquer nome (exceto palavras reservadas) para as colunas.

    A linha 2 usa a instrução STORED BY. O valor de STORED BY é o nome da classe que manipula a conexão entre o Hive e o DynamoDB. Ele deve ser definido como 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'.

    A linha 3 usa a instrução TBLPROPERTIES para associar “hivetable1” com a tabela e o esquema corretos no DynamoDB. Forneça a TBLPROPERTIES valores para os parâmetros dynamodb.table.name e dynamodb.column.mapping. Esses valores diferenciam maiúsculas de minúsculas.

    nota

    Todos os nomes de atributo do DynamoDB para a tabela devem ter colunas correspondentes na tabela do Hive. Dependendo da sua versão do Amazon EMR, os seguintes cenários ocorrerão se não houver mapeamento um para um:

    • No Amazon EMR 5.27.0 e versões posteriores, o conector tem validações que garantem um mapeamento de um para um entre nomes e colunas de atributos do DynamoDB na tabela do Hive. Ocorrerá um erro se o mapeamento de um para um não existir.

    • Na versão 5.26.0 do Amazon EMR e anteriores, a tabela do Hive não contém o par de nome-valor do DynamoDB. Se você não mapear os atributos de chave primária do DynamoDB, o Hive gerará um erro. Se você não mapear um atributo de chave não primária, nenhum erro será gerado, mas os dados não serão vistos na tabela do Hive. Se os tipos de dados não corresponderem, o valor será nulo.

Em seguida, você poderá começar a executar operações do Hive em hivetable1. As consultas executadas em hivetable1 são internamente executadas na tabela do DynamoDB dynamodbtable1 da sua conta do DynamoDB, consumindo unidades de leitura ou gravação com cada execução.

Quando você executa consultas do Hive em uma tabela do DynamoDB, precisa certificar-se de ter provisionado uma quantidade suficiente de unidades de capacidade de leitura.

Por exemplo, suponha que você tenha provisionado 100 unidades de capacidade de leitura para a sua tabela do DynamoDB. Isso permitirá que você realize 100 leituras, ou 409.600 bytes, por segundo. Se essa tabela contiver 20 GB de dados (21.474.836.480 bytes) e sua consulta do Hive realizar uma verificação de tabela completa, você poderá estimar quanto tempo a consulta demorará para ser executada:

21.474.836.480/409.600 = 52.429 segundos = 14,56 horas

A única maneira de diminuir o tempo necessário seria ajustar as unidades de capacidade de leitura na tabela DynamoDB de origem. Não adianta adicionar mais nós do Amazon EMR.

Na saída do Hive, a porcentagem de conclusão é atualizada quando um ou mais processos de mapeador são finalizados. Para uma tabela grande do DynamoDB com uma configuração baixa de capacidade de leitura provisionada, a saída de percentual de conclusão pode não ser atualizada por um longo tempo. No caso acima, o trabalho parecerá estar 0% concluído por várias horas. Para ver um status mais detalhado sobre o andamento do trabalho, acesse o console do Amazon EMR. Você poderá visualizar o status de tarefas de mapeador individuais e as estatísticas de leituras de dados. Você também pode fazer logon na interface do Hadoop no nó principal e visualizar as estatísticas do Hadoop. Isso mostrará o status de tarefas map individuais e algumas estatísticas de leitura de dados. Para obter mais informações, consulte os tópicos a seguir.

Para obter mais informações sobre instruções HiveQL de exemplo para realizar tarefas, como exportar ou importar dados do DynamoDB e unir tabelas, consulte Exemplos de comandos do Hive para exportar, importar e consultar dados no DynamoDB.

Para cancelar uma solicitação do Hive

Quando você executa uma consulta do Hive, a resposta inicial do servidor inclui o comando para cancelar a solicitação. Para cancelar a solicitação a qualquer momento no processo, use Kill Command (Comando Kill) na resposta do servidor.

  1. Insira Ctrl+C para sair do cliente de linha de comando.

  2. No prompt do shell, insira o Kill Command (Comando Kill) da resposta do servidor inicial à sua solicitação.

    Como alternativa, você pode executar o seguinte comando na linha de comando do nó principal para eliminar o trabalho do Hadoop, em que job-id é o identificador do trabalho do Hadoop e pode ser recuperado na interface de usuário do Hadoop.

    hadoop job -kill job-id

Tipos de dados para o Hive e o DynamoDB

A tabela a seguir mostra os tipos de dados do Hive disponíveis, o tipo do DynamoDB padrão ao qual eles correspondem e os tipos do DynamoDB alternativos para os quais eles também podem mapear.

Tipo do Hive Tipo do DynamoDB padrão Tipos alternativos do DynamoDB
string

string (S)

bigint ou duplo

número (N)

binary

binário (B)

boolean

booliano (BOOL)

array lista (L)

conjunto de números (NS), conjunto de strings (SS) ou conjunto de binários (BS)

mapa<string, string> item

mapa (M)

mapa<string,?> mapa (M)
nulo (NULL)

Se você deseja gravar seus dados do Hive como um tipo alternativo correspondente do DynamoDB, ou se os dados do DynamoDB contiverem valores de atributo de um tipo alternativo do DynamoDB, você poderá especificar a coluna e o tipo do DynamoDB usando o parâmetro dynamodb.type.mapping. O exemplo a seguir mostra a sintaxe para especificar um tipo alternativo de mapeamento.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.type.mapping" = "hive_column1_name:dynamodb_attribute1_datatype");

O parâmetro de mapeamento de tipo é opcional e só tem que ser especificado para as colunas que usam tipos alternativos.

Por exemplo, o comando do Hive a seguir cria uma tabela chamada hivetable2 que referencia tabela dynamodbtable2 do DynamoDB. Ela é semelhante à hivetable1, exceto pelo fato de mapear a coluna col3 para o tipo de conjunto de strings (SS).

CREATE EXTERNAL TABLE hivetable2 (col1 string, col2 bigint, col3 array<string>) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodbtable2", "dynamodb.column.mapping" = "col1:name,col2:year,col3:holidays", "dynamodb.type.mapping" = "col3:SS");

No Hive, hivetable1 e hivetable2 são idênticas. No entanto, quando os dados dessas tabelas forem gravados em suas tabelas correspondentes do DynamoDB, a dynamodbtable1 conterá listas, enquanto a dynamodbtable2 conterá conjuntos de strings.

Se você quiser gravar valores null do Hive como atributos do tipo null do DynamoDB, poderá fazer isso usando o parâmetro dynamodb.null.serialization. O exemplo a seguir mostra a sintaxe para especificar a serialização null.

CREATE EXTERNAL TABLE hive_tablename (hive_column1_name column1_datatype, hive_column2_name column2_datatype...) STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "dynamodb_tablename", "dynamodb.column.mapping" = "hive_column1_name:dynamodb_attribute1_name,hive_column2_name:dynamodb_attribute2_name...", "dynamodb.null.serialization" = "true");

O parâmetro de serialização nula é opcional e será definido como false se não especificado. Os atributos null do DynamoDB são lidos como valores null no Hive, independentemente da configuração do parâmetro. As coleções do Hive com valores null só poderão ser gravadas no DynamoDB se o parâmetro de serialização nula for especificado como true. Caso contrário, ocorrerá um erro do Hive.

O tipo bigint no Hive equivale ao tipo longo no Java, enquanto o tipo duplo no Hive equivale ao tipo duplo no Java em termos de precisão. Isso significa que, se você tiver dados numéricos armazenados no DynamoDB cuja precisão seja maior que a disponível nos tipos de dados do Hive, usar o Hive para exportar, importar ou referenciar os dados do DynamoDB pode resultar na perda de precisão ou em uma falha da consulta do Hive.

As exportações do tipo binário do DynamoDB para o Amazon Simple Storage Service (Amazon S3) ou o HDFS são armazenadas como uma string codificada em Base64. Se você estiver importando dados do Amazon S3 ou do HDFS para o tipo binário do DynamoDB, eles deverão ser codificados como uma string Base64.

Opções do Hive

Você pode definir as seguintes opções do Hive para gerenciar a transferência de dados do Amazon DynamoDB. Essas opções só persistem na sessão atual do Hive. Se você fechar o prompt de comando do Hive e reabri-lo mais tarde no cluster, essas configurações retornarão aos valores padrão.

Opções do Hive Descrição
dynamodb.throughput.read.percent

Defina a taxa de operações de leitura para manter sua taxa de throughput provisionado do DynamoDB no intervalo alocado para sua tabela. O valor está entre 0.1 e 1.5, inclusive.

O valor de 0,5 é a taxa de leitura padrão, que significa que o Hive tentará consumir metade dos recursos de throughput provisionado de leitura na tabela. Aumentar esse valor acima de 0,5 aumenta a taxa de solicitações de leitura. Diminuí-lo abaixo de 0,5 diminui a taxa de solicitações de leitura. Essa taxa de leituras é aproximada. A taxa de leituras real dependerá de fatores como, por exemplo, a existência de distribuição uniforme de chaves no DynamoDB.

Se você perceber que o seu throughput provisionado está sendo frequentemente excedido pela operação do Hive, ou se o tráfego de leituras dinâmicas estiver muito limitado, reduza esse valor abaixo de 0.5. Se você tiver capacidade suficiente e quiser uma operação do Hive mais rápida, defina esse valor acima de 0.5. Também é possível configurar o excesso de assinaturas, definindo o valor como até 1.5 se você acredita que existem operações de entrada/saída não utilizadas disponíveis.

dynamodb.throughput.write.percent

Defina a taxa de operações de gravação para manter sua taxa de throughput provisionado do DynamoDB no intervalo alocado para sua tabela. O valor está entre 0.1 e 1.5, inclusive.

O valor de 0,5 é a taxa de gravação padrão, que significa que o Hive tentará consumir metade dos recursos de throughput provisionado de gravação na tabela. Aumentar esse valor acima de 0,5 aumenta a taxa de solicitações de gravação. Diminuí-lo abaixo de 0,5 diminui a taxa de solicitações de gravação. Essa taxa de gravações é aproximada. A taxa de gravações real dependerá de fatores como se há uma distribuição uniforme de chaves no DynamoDB

Se você perceber que o seu throughput provisionado está sendo frequentemente excedido pela operação do Hive, ou se o tráfego de gravações dinâmicas estiver muito limitado, reduza esse valor abaixo de 0.5. Se você tiver capacidade suficiente e quiser uma operação do Hive mais rápida, defina esse valor acima de 0.5. Também é possível configurar o excesso de assinaturas, definindo o valor como até 1.5 se você acredita que existem operações de entrada/saída não utilizadas disponíveis ou se este for o upload de dados inicial na tabela e ainda não houver tráfego dinâmico.

dynamodb.endpoint

Especifique o endpoint para o serviço do DynamoDB. Para obter mais informações sobre os endpoints do DynamoDB disponíveis, consulte Regions and endpoints.

dynamodb.max.map.tasks

Especifique o número máximo de tarefas map ao ler dados do DynamoDB. Esse valor deve ser igual ou maior que 1.

dynamodb.retry.duration

Especifique o número de minutos a serem usados como a duração do tempo limite para tentar novamente os comandos do Hive. Esse valor deve ser um número inteiro igual a ou maior que 0. A duração do tempo limite padrão é de dois minutos.

Essas opções são definidas usando o comando SET, como mostra o exemplo a seguir.

SET dynamodb.throughput.read.percent=1.0; INSERT OVERWRITE TABLE s3_export SELECT * FROM hiveTableName;