O conector Kudu permite consultar, inserir e excluir dados armazenados em tabelas do Apache Kudu.
Informações básicas
Este tópico aborda os seguintes assuntos sobre o conector Kudu:
Pré-requisitos
Crie um cluster Trino e um cluster Hadoop com o service Kudu. Para mais informações, consulte Create a cluster.
Limitações
Kudu 1.10 ou superior.
Conectividade de rede entre os clusters Trino e Hadoop.
Os nomes de tabelas e colunas do Kudu devem estar em letras minúsculas.
Modifique a configuração do conector Kudu
Para mais informações, consulte Configure connectors.
No console E-MapReduce (EMR), acesse a página Configure do service Trino. Na área Service Configuration, clique na aba kudu.properties.
|
Parâmetro |
Descrição |
|
kudu.client.master-addresses |
Lista de endereços mestres do Kudu separados por vírgula. Formatos suportados: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051, [2001:db8::1], [2001:db8::1]:7051 e 2001:db8::1. Valor padrão: localhost. Nota
Para gravar e consultar dados nas tabelas Kudu, altere o valor padrão de localhost para o endereço IP ou nome do host do nó mestre do Kudu (por exemplo, master-1-1). |
|
kudu.schema-emulation.enabled |
Define se a emulação de schema deve ser ativada.
Importante
Para adicionar este item, clique em Add Configuration Item na aba kudu.properties. Para obter instruções, consulte Add configuration items. |
|
kudu.schema-emulation.prefix |
Prefixo para emulação de schema. Importante
Este item de configuração é obrigatório quando O prefixo padrão é |
|
kudu.client.default-admin-operation-timeout |
Tempo limite padrão para operações administrativas, como Create Table e Delete Table. Valor padrão: 30s. |
|
kudu.client.default-operation-timeout |
Tempo limite padrão para operações do usuário. Valor padrão: 30s. |
|
kudu.client.default-socket-read-timeout |
Tempo limite padrão para aguardar dados de um socket. Valor padrão: 10s. |
|
kudu.client.disable-statistics |
Define se a coleta de estatísticas do cliente Kudu deve ser desativada.
|
Consultar dados
O Apache Kudu não suporta schemas nativamente. No entanto, é possível configurar o conector Kudu para emulá-los.
Emulação de schema desativada (padrão)
Por padrão, a emulação de schema vem desativada. Nesse cenário, todas as tabelas Kudu pertencem ao schema default.
Por exemplo, para consultar a tabela orders, execute SELECT * FROM kudu.default.orders. Caso o catálogo e o schema estejam definidos como kudu e default, respectivamente, simplifique a consulta para SELECT * FROM orders.
Os nomes das tabelas Kudu podem conter quaisquer caracteres. Se um nome incluir caracteres especiais, envolva-o entre aspas duplas ("). Por exemplo, para consultar a tabela special.table!, execute SELECT * FROM kudu.default."special.table!".
Exemplos:
-
Crie uma tabela
usersno schemadefault.CREATE TABLE kudu.default.users ( user_id int WITH (primary_key = true), first_name varchar, last_name varchar ) WITH ( partition_by_hash_columns = ARRAY['user_id'], partition_by_hash_buckets = 2 );NotaAo criar uma tabela, especifique as informações obrigatórias, como chave primária, formatos de codificação e compressão de colunas, além de partições por hash ou por intervalo.
-
Visualize as informações da tabela.
DESCRIBE kudu.default.users;O comando retorna uma saída semelhante à seguinte:
Column | Type | Extra | Comment ------------+---------+-------------------------------------------------+--------- user_id | integer | primary_key, encoding=auto, compression=default | first_name | varchar | nullable, encoding=auto, compression=default | last_name | varchar | nullable, encoding=auto, compression=default | (3 rows) -
Insira dados.
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse'); -
Consulte os dados.
SELECT * FROM kudu.default.users;
Emulação de schema ativada
Se você ativar a emulação de schema no arquivo de configuração do conector (etc/catalog/kudu.properties), as tabelas serão mapeadas para schemas com base em uma convenção de nomenclatura.
-
Ao definir
kudu.schema-emulation.enabled=trueekudu.schema-emulation.prefix=, o mapeamento das tabelas ocorre da seguinte forma:Nome da tabela Kudu
Nome da tabela Presto
orderskudu.default.orderspart1.part2kudu.part1.part2x.y.zkudu.x."y.z"NotaComo o Kudu não oferece suporte nativo a schemas, o Presto cria uma tabela especial chamada
$schemaspara gerenciá-los. -
Ao definir
kudu.schema-emulation.enabled=trueekudu.schema-emulation.prefix=presto::, o mapeamento das tabelas segue o padrão abaixo:Nome da tabela Kudu
Nome da tabela Presto
orderskudu.default.orderspart1.part2kudu.default."part1.part2"x.y.zkudu.default."x.y.z"presto::part1.part2kudu.part1.part2presto::x.y.zkudu.x."y.z"NotaComo o Kudu não oferece suporte nativo a schemas, o Presto cria uma tabela especial chamada
presto::$schemaspara gerenciá-los.
Mapeamento de tipos de dados
A tabela a seguir apresenta os mapeamentos de tipos de dados entre Presto e Kudu.
|
Tipo Presto |
Tipo Kudu |
Observações |
|
BOOLEAN |
BOOL |
N/A |
|
TINYINT |
INT8 |
|
|
SMALLINT |
INT16 |
|
|
INTEGER |
INT32 |
|
|
BIGINT |
INT64 |
|
|
REAL |
FLOAT |
|
|
DOUBLE |
DOUBLE |
|
|
VARCHAR |
STRING |
Ao criar uma tabela Kudu a partir de uma tabela Presto usando a instrução |
|
VARBINARY |
BINARY |
|
|
TIMESTAMP |
UNIXTIME_MICROS |
Este mapeamento reduz a precisão da coluna Kudu de microssegundos (µs) para milissegundos (ms). |
|
DECIMAL |
DECIMAL |
Suportado apenas pelo Kudu 1.7.0 e versões posteriores. |
|
DATE |
N/A |
Não suportado. Ao criar uma tabela Kudu a partir de uma tabela Presto usando a instrução |
|
CHAR |
N/A |
Não suportado. |
|
TIME |
||
|
JSON |
||
|
TIME WITH TIME ZONE |
||
|
TIMESTAMP WITH TIME ZONE |
||
|
INTERVAL YEAR TO MONTH |
||
|
INTERVAL DAY TO SECOND |
||
|
ARRAY |
||
|
MAP |
||
|
IPADDRESS |
Instruções SQL do Presto suportadas
A instrução ALTER SCHEMA ... RENAME TO ... não é suportada.
|
Instrução |
Descrição |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Disponível apenas quando a emulação de schema está ativada. |
|
|
Disponível apenas quando a emulação de schema está ativada. |
|
|
Cria uma tabela. Para detalhes, consulte Criar uma tabela. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Adiciona uma coluna. Para detalhes, consulte Adicionar uma coluna. |
|
|
Estas instruções aplicam-se apenas a colunas que não fazem parte da chave primária. |
|
|
|
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Nenhuma. |
|
|
Esta instrução equivale a |
|
|
Adiciona uma partição por intervalo. Para detalhes, consulte Partições por intervalo. |
|
|
Remove uma partição por intervalo. Para detalhes, consulte Partições por intervalo. |
Crie uma tabela
Para criar uma tabela, especifique suas colunas, tipos de dados e informações de particionamento. Também é possível definir outros detalhes, como formato de codificação ou compressão das colunas. Veja um exemplo abaixo.
CREATE TABLE user_events (
user_id int WITH (primary_key = true),
event_name varchar WITH (primary_key = true),
message varchar,
details varchar WITH (nullable = true, encoding = 'plain')
) WITH (
partition_by_hash_columns = ARRAY['user_id'],
partition_by_hash_buckets = 5,
number_of_replicas = 3
);
Neste exemplo, a chave primária consiste nas colunas user_id e event_name. A tabela é dividida em cinco partições com base nos valores de hash da coluna user_id. O parâmetro number_of_replicas está definido como 3.
Ao criar uma tabela, observe os seguintes pontos:
As colunas de chave primária devem ser listadas primeiro. As colunas de chave de partição devem ser um subconjunto das colunas de chave primária.
number_of_replicas: Quantidade de réplicas de tablet, que deve ser um número ímpar. Se não especificado, o valor padrão da configuração do Kudu Master será utilizado.O Kudu suporta partições por hash e por intervalo. Uma partição por hash distribui linhas em buckets com base em um valor de hash. Já a partição por intervalo distribui linhas conforme uma chave de partição ordenada, exigindo criação explícita dos intervalos específicos. O Kudu também permite particionamento multinível. Toda tabela deve ter pelo menos uma partição por hash ou por intervalo, podendo ter múltiplas partições por hash, mas no máximo uma partição por intervalo.
Propriedades da coluna
Além do nome e do tipo de dados, você pode especificar as seguintes propriedades para a coluna.
|
Parâmetro |
Tipo |
Descrição |
|
primary_key |
BOOLEAN |
Se verdadeiro, esta coluna faz parte da chave primária. Uma chave primária do Kudu impõe uma restrição de unicidade. Ao inserir uma linha com uma chave primária já existente, a linha atual é atualizada. Para mais informações, consulte Primary Key Design. |
|
nullable |
BOOLEAN |
Se verdadeiro, a coluna pode aceitar valores nulos. Importante
Colunas de chave primária não podem ser nulas. |
|
encoding |
VARCHAR |
Formato de codificação da coluna, que reduz o armazenamento e melhora o desempenho das consultas. Se não especificado, o Kudu seleciona automaticamente uma codificação com base no tipo de dados da coluna. Valores válidos: auto, plain, bitshuffle, runlength, prefix, dictionary e group_varint. Para mais informações, consulte Column Encoding. |
|
compression |
VARCHAR |
Formato de compressão da coluna. Se não especificado, o Kudu usa o formato de compressão padrão. Valores válidos: |
Veja um exemplo:
CREATE TABLE mytable (
name varchar WITH (primary_key = true, encoding = 'dictionary', compression = 'snappy'),
index bigint WITH (nullable = true, encoding = 'runlength', compression = 'lz4'),
comment varchar WITH (nullable = true, encoding = 'plain', compression = 'default'),
...
) WITH (...);
Design de partições
Esta seção descreve como definir partições por hash e por intervalo.
-
Partição por hash
-
Definição de um grupo de partições
Utilize as propriedades de tabela partition_by_hash_columns e
partition_by_hash_bucketspara especificar as colunas de chave de partição e o número de partições, respectivamente. Todas as colunas de chave de partição devem ser um subconjunto das colunas de chave primária. Confira o exemplo:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1', 'col2'], partition_by_hash_buckets = 4 )NotaEste exemplo define uma partição por hash nas colunas
col1ecol2, distribuindo os dados em quatro partições. -
Definição de dois grupos de partições
Para definir dois grupos independentes de partições por hash, especifique também as propriedades de tabela
partition_by_second_hash_columnsepartition_by_second_hash_buckets. Veja o exemplo:CREATE TABLE mytable ( col1 varchar WITH (primary_key=true), col2 varchar WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['col1'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['col2'], partition_by_second_hash_buckets = 3 )NotaEste exemplo define dois grupos de partições por hash. O primeiro grupo distribui as linhas em duas partições com base na coluna
col1. O segundo grupo distribui as linhas em três partições com base na colunacol2. A tabela possui um total de seis partições (2 × 3).
-
-
Partição por intervalo
Uma tabela Kudu pode ter no máximo uma partição por intervalo, definida pela propriedade de tabela
partition_by_range_columns. Durante a criação da tabela, defina os intervalos de partição usando a propriedaderange_partitions. Para gerenciar partições por intervalo em uma tabela existente, utilize os procedimentos armazenadoskudu.system.add_range_partitionekudu.system.drop_range_partition. Segue um exemplo:CREATE TABLE events ( rack varchar WITH (primary_key=true), machine varchar WITH (primary_key=true), event_time timestamp WITH (primary_key=true), ... ) WITH ( partition_by_hash_columns = ARRAY['rack'], partition_by_hash_buckets = 2, partition_by_second_hash_columns = ARRAY['machine'], partition_by_second_hash_buckets = 3, partition_by_range_columns = ARRAY['event_time'], range_partitions = '[{"lower": null, "upper": "2018-01-01T00:00:00"}, {"lower": "2018-01-01T00:00:00", "upper": null}]' )NotaEste exemplo define uma tabela com dois grupos de partições por hash e uma partição por intervalo na coluna
event_time. O intervalo é dividido no carimbo de data/hora2018-01-01T00:00:00. -
Gerenciamento de partições por intervalo
Os exemplos a seguir demonstram operações de particionamento:
-
Adicionar uma partição por intervalo
CALL kudu.system.add_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>) -
Remover uma partição por intervalo
CALL kudu.system.drop_range_partition(<YOUR_SCHEMA_NAME>, <YOUR_TABLE_NAME>, <range_partition_as_json_string>)
Parâmetro
Descrição
<YOUR_SCHEMA_NAME>Schema onde a tabela está localizada.
<YOUR_TABLE_NAME>Nome da tabela.
<range_partition_as_json_string>Limites superior e inferior da partição por intervalo, especificados como uma string JSON. Use o formato
'{"lower": <value>, "upper": <value>}'. Se a partição tiver várias colunas, utilize o formato'{"lower": [<value_col1>,...], "upper": [<value_col1>,...]}'. O formato do valor depende do tipo de dados da coluna. A lista a seguir mapeia os tipos de dados para seus formatos de string JSON necessários:-
BIGINT:
'{"lower": 0, "upper": 1000000}' -
SMALLINT:
'{"lower": 10, "upper": null}' -
VARCHAR:
'{"lower": "A", "upper": "M"}' -
TIMESTAMP:
'{"lower": "2018-02-01T00:00:00.000", "upper": "2018-02-01T12:00:00.000"}' -
BOOLEAN:
'{"lower": false, "upper": true}' -
VARBINARY: Uma string codificada em Base64.
NotaUm valor
nullindica um limite ilimitado.Confira um exemplo:
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')NotaEste exemplo adiciona uma partição por intervalo à tabela
eventsno schemamyschema. O limite inferior da partição é2018-01-01, que corresponde ao carimbo de data/hora2018-01-01T00:00:00.000. O limite superior é2018-06-01.Use a instrução
SHOW CREATE TABLEpara visualizar as partições por intervalo existentes. Essas informações aparecem na propriedade de tabelarange_partitions. -
Adicionar uma coluna
Utilize a instrução ALTER TABLE ... ADD COLUMN ... para adicionar uma coluna a uma tabela existente. Também é possível especificar propriedades para a nova coluna. Para detalhes sobre as propriedades de coluna, consulte Criar uma tabela.
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')