Use o conector Kudu com o Trino para consultar, inserir e excluir dados em tabelas do Apache Kudu.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster Hadoop com o serviço Kudu (versão 1.10 ou posterior)
Um cluster Trino com conectividade de rede ao cluster Hadoop
Para criar esses clusters, consulte Criar um cluster.
Limitações
O conector Kudu exige o Kudu 1.10 ou posterior.
Os nomes de tabelas e colunas do Kudu aceitam apenas letras minúsculas.
Deve haver conexão de rede entre o cluster Trino e o cluster Hadoop.
Configurar o conector Kudu
No console do E-MapReduce (EMR), acesse a aba Configure da página de serviço do Trino e clique em kudu.properties. Modifique ou adicione itens de configuração conforme necessário.
Para obter a referência completa sobre configuração de conectores, consulte Configurar um conector.
Veja abaixo um modelo completo do arquivo kudu.properties com todos os itens de configuração suportados:
connector.name=kudu
## Required: Kudu master address(es). Separate multiple addresses with commas.
## Supported formats: example.com, example.com:7051, 192.0.2.1, 192.0.2.1:7051,
## [2001:db8::1], [2001:db8::1]:7051, 2001:db8::1
## Change localhost to the IP address or hostname of your Kudu master node (e.g., master-1-1).
kudu.client.master-addresses=localhost
## Schema emulation lets Trino map Kudu tables to schemas using naming conventions.
## By default, all tables appear in the "default" schema.
#kudu.schema-emulation.enabled=false
## Prefix used when schema emulation is enabled. Standard prefix is "presto::". Empty prefix is also valid.
## Required only when kudu.schema-emulation.enabled=true.
#kudu.schema-emulation.prefix=
## Advanced Kudu Java client configuration
## Timeout for administrative operations (e.g., CREATE TABLE, DROP TABLE). Default: 30s.
#kudu.client.default-admin-operation-timeout=30s
## Timeout for user operations. Default: 30s.
#kudu.client.default-operation-timeout=30s
## Timeout for waiting on data from a socket. Default: 10s.
#kudu.client.default-socket-read-timeout=10s
## Whether to disable Kudu client statistics collection. Default: false.
#kudu.client.disable-statistics=false
Para adicionar um item de configuração ausente no arquivo kudu.properties por padrão, clique em Add Configuration Item na aba kudu.properties. Para mais detalhes, consulte Adicionar itens de configuração.
Consultar dados
O Apache Kudu não oferece suporte nativo a esquemas, mas o conector Kudu pode emulá-los por meio de convenções de nomenclatura.
Emulação de esquema desativada (padrão)
Com a emulação de esquema desativada, todas as tabelas do Kudu aparecem no esquema default.
Consulte a tabela orders usando seu nome totalmente qualificado:
SELECT * FROM kudu.default.orders;
Se você definir kudu como catálogo e default como esquema, a consulta será simplificada para:
SELECT * FROM orders;
Caso o nome da tabela contenha caracteres especiais, envolva-o entre aspas duplas:
SELECT * FROM kudu.default."special.table!";
Exemplo rápido: criar e consultar uma tabela
-
Crie uma tabela chamada
usersno esquemadefault: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 );Ao criar uma tabela, especifique a chave primária, a codificação da coluna ou o formato de compactação e as informações de partição (hash ou intervalo).
-
Inspecione o esquema da tabela:
DESCRIBE kudu.default.users;Saída esperada:
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 linhas:
INSERT INTO kudu.default.users VALUES (1, 'Donald', 'Duck'), (2, 'Mickey', 'Mouse'); -
Consulte os dados:
SELECT * FROM kudu.default.users;
Emulação de esquema ativada
Ative a emulação de esquema definindo kudu.schema-emulation.enabled=true no arquivo etc/catalog/kudu.properties. As tabelas do Kudu serão então mapeadas para esquemas do Trino com base em seus nomes.
Mapeamento com prefixo vazio (kudu.schema-emulation.prefix=)
|
Nome da tabela Kudu |
Nome da tabela Trino |
|
|
|
|
|
|
|
|
|
O Kudu não oferece suporte a esquemas. O Trino cria uma tabela especial chamada $schemas para gerenciá-los.
Mapeamento com o prefixo padrão (kudu.schema-emulation.prefix=presto::)
|
Nome da tabela Kudu |
Nome da tabela Trino |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Com o prefixo padrão, o Trino cria uma tabela especial chamada presto::$schemas para gerenciar os esquemas.
Mapeamentos de tipos de dados
De Trino para Kudu
Ao gravar dados do Trino para o Kudu, aplicam-se os seguintes mapeamentos de tipos:
|
Tipo Trino |
Tipo Kudu |
Observações |
|
BOOLEAN |
BOOL |
|
|
TINYINT |
INT8 |
|
|
SMALLINT |
INT16 |
|
|
INTEGER |
INT32 |
|
|
BIGINT |
INT64 |
|
|
REAL |
FLOAT |
|
|
DOUBLE |
DOUBLE |
|
|
VARCHAR |
STRING |
O comprimento máximo é perdido ao usar |
|
VARBINARY |
BINARY |
|
|
TIMESTAMP |
UNIXTIME_MICROS |
O Kudu armazena precisão de microssegundos, mas a reduz para resolução de milissegundos. |
|
DECIMAL |
DECIMAL |
Requer servidor Kudu 1.7.0 ou posterior. |
|
DATE |
N/A |
Não há tipo correspondente no Kudu. Convertido para STRING ao usar |
|
CHAR |
N/A |
Não há tipo correspondente no Kudu. |
Os seguintes tipos do Trino não são suportados: TIME, JSON, TIME WITH TIMEZONE, TIMESTAMP WITH TIME ZONE, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, ARRAY, MAP, IPADDRESS.
Instruções SQL suportadas
O conector oferece suporte a acesso de leitura e gravação aos dados do Kudu. As seguintes instruções SQL são compatíveis:
SELECTINSERT INTO ... VALUESINSERT INTO ... SELECT ...DELETECREATE TABLE— consulte Criar uma tabelaCREATE TABLE ... ASDROP TABLEALTER TABLE ... RENAME TO ...ALTER TABLE ... ADD COLUMN ...— consulte Adicionar uma colunaALTER TABLE ... RENAME COLUMN ...— suportado apenas para colunas que não são chave primáriaALTER TABLE ... DROP COLUMN ...— suportado apenas para colunas que não são chave primáriaCREATE SCHEMA— suportado apenas quando a emulação de esquema está ativadaDROP SCHEMA— suportado apenas quando a emulação de esquema está ativadaSHOW SCHEMASSHOW TABLESSHOW CREATE TABLESHOW COLUMNS FROMDESCRIBE— equivalente aSHOW COLUMNS FROMCALL kudu.system.add_range_partition— consulte Gerenciar partições por intervaloCALL kudu.system.drop_range_partition— consulte Gerenciar partições por intervalo
A instrução ALTER SCHEMA ... RENAME TO ... não é suportada.
Criar uma tabela
Toda tabela do Kudu requer colunas com tipos de dados, uma chave primária e informações de partição. A codificação e a compactação das colunas são opcionais.
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:
user_ideevent_namesão colunas de chave primária.A tabela usa particionamento hash em
user_idcom 5 buckets.number_of_replicasestá definido como 3, controlando o número de réplicas de tablet.
Regras principais ao criar uma tabela:
Liste as colunas de chave primária antes de todas as outras colunas.
Apenas colunas de chave primária podem servir como colunas de chave de partição.
O parâmetro
number_of_replicasé opcional e deve ser um número ímpar. Se omitido, aplica-se o fator de replicação padrão do mestre Kudu.Uma tabela deve ter pelo menos uma partição hash ou por intervalo. É possível ter múltiplas partições hash, mas apenas uma partição por intervalo.
Propriedades da coluna
Especifique as propriedades da coluna na cláusula WITH:
|
Propriedade da coluna |
Tipo de dado |
Descrição |
|
|
BOOLEAN |
Marca a coluna como chave primária. O Kudu impõe unicidade nas chaves primárias; inserir uma linha com chave primária duplicada atualiza a linha existente. Consulte Primary Key Design. |
|
|
BOOLEAN |
Permite que a coluna contenha valores nulos. Colunas de chave primária não podem ser anuláveis. |
|
|
VARCHAR |
Formato de codificação da coluna. O padrão é a codificação baseada em tipo do Kudu. Valores válidos: |
|
|
VARCHAR |
Formato de compactação da coluna. O padrão é a compactação padrão do Kudu. Valores válidos: |
Exemplo com codificação e compactação explícitas:
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ção
O Kudu suporta partições hash e partições por intervalo. Uma tabela deve ter pelo menos uma partição de qualquer um desses tipos.
Definir partições hash
Especifique partition_by_hash_columns (colunas de chave de partição) e partition_by_hash_buckets (número de buckets). As colunas de chave de partição devem ser um subconjunto das colunas de chave primária.
Um grupo de partição hash:
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
);
col1 e col2 são as colunas de chave de partição hash. As linhas são distribuídas em 4 buckets.
Dois grupos independentes de partição hash:
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
);
O primeiro grupo distribui as linhas por col1 em 2 buckets; o segundo distribui por col2 em 3 buckets. O número total de partições é 6 (2 x 3).
Definir partições por intervalo
Use partition_by_range_columns para especificar as colunas de partição por intervalo e range_partitions para definir os limites iniciais da partição.
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}]'
);
Esta tabela possui dois grupos de partição hash e uma partição por intervalo em event_time, dividida em 2018-01-01T00:00:00.
Gerenciar partições por intervalo
Adicione ou remova partições por intervalo em uma tabela existente usando procedimentos armazenados:
-- Add a range partition
CALL kudu.system.add_range_partition(<schema_name>, <table_name>, <range_partition_as_json_string>)
-- Drop a range partition
CALL kudu.system.drop_range_partition(<schema_name>, <table_name>, <range_partition_as_json_string>)
Parâmetros:
|
Parâmetro |
Descrição |
|
|
O esquema que contém a tabela. |
|
|
O nome da tabela. |
|
|
Os limites da partição no formato JSON: |
Formatos de valor JSON por tipo de dado:
|
Tipo de dado |
Exemplo |
|
BIGINT |
|
|
SMALLINT |
|
|
VARCHAR |
|
|
TIMESTAMP |
|
|
BOOLEAN |
|
|
VARBINARY |
Strings codificadas em Base64 |
Exemplo: Adicionar uma partição por intervalo à tabela events no esquema myschema, abrangendo registros de 2018-01-01 a 2018-06-01:
CALL kudu.system.add_range_partition('myschema', 'events', '{"lower": "2018-01-01", "upper": "2018-06-01"}')
O limite inferior "2018-01-01" é interpretado como 2018-01-01T00:00:00.000.
Para visualizar todas as partições por intervalo existentes em uma tabela, execute SHOW CREATE TABLE. A propriedade range_partitions na saída lista os limites atuais da partição.
Adicionar uma coluna
Use ALTER TABLE ... ADD COLUMN ... para adicionar uma coluna a uma tabela existente. Propriedades de coluna como nullable e encoding são suportadas.
ALTER TABLE mytable ADD COLUMN extraInfo varchar WITH (nullable = true, encoding = 'plain')
Para ver as propriedades de coluna disponíveis, consulte Propriedades da coluna.