Este tópico descreve como usar o conector do ClickHouse para gravar dados no ClickHouse.
Informações de contexto
O ClickHouse é um sistema de gerenciamento de banco de dados orientado a colunas para processamento analítico online (OLAP). Para mais informações, consulte O que é o ClickHouse?.
A tabela a seguir descreve os recursos do conector do ClickHouse.
|
Categoria |
Detalhes |
|
Tipo suportado |
Apenas tabela de resultados |
|
Modo de execução |
Modos em lote e de streaming |
|
Formato de dados |
Não aplicável |
|
Métricas específicas do conector |
Nota
Para mais informações sobre essas métricas, consulte Monitoring metrics. |
|
Tipo de API |
SQL |
|
Suporte para atualizar ou excluir dados em uma tabela de resultados |
O conector suporta atualizações e exclusões se você especificar uma chave primária na DDL da tabela de resultados do Flink e definir o parâmetro |
Recursos
Grave dados diretamente nas tabelas locais de uma tabela distribuída do ClickHouse.
Obtenha a semântica exactly-once ao gravar no ClickHouse no Alibaba Cloud E-MapReduce (EMR).
Pré-requisitos
Crie uma tabela do ClickHouse. Para mais informações, consulte Criar uma nova tabela.
-
Configure uma lista de permissões.
Se você usar o ApsaraDB for ClickHouse, consulte Configure a whitelist.
Se você usar o ClickHouse no Alibaba Cloud E-MapReduce (EMR), consulte Manage security groups.
Se você usar um cluster do ClickHouse autogerenciado em uma instância do ECS, consulte Security group overview.
Para todas as outras configurações, configure a lista de permissões na máquina onde o ClickHouse está implantado para permitir o acesso a partir da implantação do Realtime Compute for Apache Flink.
NotaPara visualizar o segmento de rede do vSwitch para o Realtime Compute for Apache Flink, consulte How do I configure a whitelist?.
Limitações
O parâmetro
sink.parallelismnão é suportado.Por padrão, o sink do ClickHouse fornece a semântica at-least-once.
O conector do ClickHouse é suportado apenas no Ververica Runtime (VVR) 3.0.2 e versões posteriores.
A opção
ignoreDeleteé suportada apenas no VVR 3.0.3, VVR 4.0.7 e versões posteriores.O tipo de dado Nested do ClickHouse é suportado apenas no VVR 4.0.10 e versões posteriores.
Gravações diretas nas tabelas locais de uma tabela distribuída são suportadas apenas no VVR 4.0.11 e versões posteriores.
A semântica exactly-once para gravação no ClickHouse no EMR está disponível apenas no VVR 4.0.11 e versões posteriores. No entanto, devido a alterações nas capacidades do product EMR, a semântica exactly-once também não está disponível para o ClickHouse no EMR em versões posteriores a 3.45.1 e 5.11.1.
O modo de gravação
balance, que distribui dados uniformemente entre os nós da tabela local, está disponível apenas no VVR 8.0.7 e versões posteriores.A gravação em uma tabela local do ClickHouse é suportada apenas para o ApsaraDB for ClickHouse Community-compatible Edition.
Ao registrar um catálogo do ClickHouse, o nome do banco de dados padrão não pode conter um hífen (
-). Caso contrário, a validação da URL JDBC falhará.
Sintaxe
CREATE TABLE clickhouse_sink (
id INT,
name VARCHAR,
age BIGINT,
rate FLOAT
) WITH (
'connector' = 'clickhouse',
'url' = '<yourUrl>',
'userName' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTablename>',
'maxRetryTimes' = '3',
'batchSize' = '8000',
'flushIntervalMs' = '1000',
'ignoreDelete' = 'true',
'shardWrite' = 'false',
'writeMode' = 'partition',
'shardingKey' = 'id'
);
Parâmetros WITH
|
Parâmetro |
Descrição |
Tipo |
Obrigatório |
Padrão |
Observações |
|
connector |
O tipo da tabela de resultados. |
String |
Sim |
N/D |
Defina o valor como clickhouse. |
|
url |
A URL JDBC do seu cluster do ClickHouse. |
String |
Sim |
N/D |
O formato da URL é Nota
Se você quiser gravar dados em uma tabela distribuída do ClickHouse, |
|
userName |
O nome de usuário para acessar o ClickHouse. |
String |
Sim |
N/D |
N/D |
|
password |
A senha para acessar o ClickHouse. |
String |
Sim |
N/D |
N/D |
|
tableName |
O nome da tabela do ClickHouse. |
String |
Sim |
N/D |
N/D |
|
maxRetryTimes |
O número máximo de tentativas após uma falha ao inserir dados na tabela de resultados. |
Int |
Não |
3 |
N/D |
|
batchSize |
O número de registros a serem gravados em um único lote. |
Int |
Não |
100 |
Se o número de entradas de dados no cache atingir o valor do parâmetro batchSize ou o tempo de espera exceder flushIntervalMs, o sistema grava automaticamente os dados do cache na tabela do ClickHouse. |
|
flushIntervalMs |
O intervalo de tempo, em milissegundos, para liberar o buffer. |
Long |
Não |
1000 |
A unidade é milissegundos. |
|
ignoreDelete |
Especifica se as mensagens de exclusão devem ser ignoradas. |
Boolean |
Não |
true |
Valores válidos:
Nota
Se você definir |
|
shardWrite |
Para uma tabela distribuída do ClickHouse, especifica se os dados devem ser gravados diretamente nas tabelas locais subjacentes. |
Boolean |
Não |
false |
Valores válidos:
|
|
inferLocalTable |
Ao gravar em uma tabela distribuída do ClickHouse, especifica se as tabelas locais subjacentes devem ser descobertas automaticamente e se a gravação deve ser feita diretamente nelas. |
Boolean |
Não |
false |
Valores válidos:
Nota
Este parâmetro é ignorado ao gravar em uma tabela não distribuída. |
|
writeMode |
A estratégia para gravar dados nas tabelas locais de uma tabela distribuída. |
Enum |
Não |
default |
Valores válidos:
Nota
Se você definir |
|
shardingKey |
A chave usada para particionar dados entre os nós da tabela local. |
String |
Não |
N/D |
Quando writeMode é definido como 'partition', o parâmetro shardingKey é obrigatório. Ele pode conter vários campos separados por vírgulas (,). |
|
exactlyOnce |
Especifica se a semântica exactly-once deve ser ativada. |
Boolean |
Não |
false |
Valores válidos:
Nota
|
Mapeamento de tipos de dados
|
Tipo Flink |
Tipo ClickHouse |
|
BOOLEAN |
UInt8 / Boolean Nota
O ClickHouse v21.12 e versões posteriores suportam o tipo Boolean. Para versões anteriores, o tipo BOOLEAN do Flink é mapeado para o tipo UInt8 do ClickHouse. |
|
TINYINT |
Int8 |
|
SMALLINT |
Int16 |
|
INTEGER |
Int32 |
|
BIGINT |
Int64 |
|
BIGINT |
UInt32 |
|
FLOAT |
Float32 |
|
DOUBLE |
Float64 |
|
CHAR |
FixedString |
|
VARCHAR |
String |
|
BINARY |
FixedString |
|
VARBINARY |
String |
|
DATE |
Date |
|
TIMESTAMP(0) |
DateTime |
|
TIMESTAMP(x) |
Datetime64(x) |
|
DECIMAL |
DECIMAL |
|
ARRAY |
ARRAY |
|
Nested |
O conector do ClickHouse não suporta os tipos TIME, MAP, MULTISET e ROW do Flink.
Para usar o tipo de dado Nested do ClickHouse, você deve mapeá-lo para um tipo ARRAY no Flink. Por exemplo:
-- ClickHouse
CREATE TABLE visits (
StartDate Date,
Goals Nested
(
ID UInt32,
OrderID String
)
...
);
Mapeie os tipos da seguinte forma:
-- Flink
CREATE TABLE visits (
StartDate DATE,
`Goals.ID` ARRAY<LONG>,
`Goals.OrderID` ARRAY<STRING>
);
Em versões do VVR anteriores à 6.0.6, a gravação de dados DateTime64 com o driver JDBC oficial do ClickHouse causava perda de precisão ao truncar valores para segundos. Como resultado, apenas dados TIMESTAMP com precisão de nível de segundo, como TIMESTAMP(0), podiam ser gravados com sucesso. O VVR 6.0.6 e versões posteriores resolvem esse problema, permitindo gravações precisas de dados DateTime64.
Exemplos
-
Exemplo 1: Grave em uma tabela de nó único.
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = '<yourUrl>', 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = '<yourTablename>' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source; -
Exemplo 2: Grave em uma tabela distribuída.
Suponha que uma tabela distribuída chamada distributed_table_test seja criada a partir de três tabelas locais chamadas local_table_test, localizadas nos nós 192.XX.XX.1, 192.XX.XX.2 e 192.XX.XX.3.
-
Se você quiser que o Flink grave dados diretamente nas tabelas locais e particione os dados por uma chave, use a seguinte DDL:
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002,192.XX.XX.3:3002/default', 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = 'local_table_test', 'shardWrite' = 'true', 'writeMode' = 'partition', 'shardingKey' = 'name' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source; -
Se você quiser que o Flink descubra automaticamente os nós da tabela local em vez de especificá-los manualmente na URL, use a seguinte DDL:
CREATE TEMPORARY TABLE clickhouse_source ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'datagen', 'rows-per-second' = '50' ); CREATE TEMPORARY TABLE clickhouse_output ( id INT, name VARCHAR, age BIGINT, rate FLOAT ) WITH ( 'connector' = 'clickhouse', 'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default', -- The JDBC URL of a node in the cluster. 'userName' = '<yourUsername>', 'password' = '<yourPassword>', 'tableName' = 'distributed_table_test', -- The name of the distributed table. 'shardWrite' = 'true', 'inferLocalTable' = 'true', -- Set inferLocalTable to true. 'writeMode' = 'partition', 'shardingKey' = 'name' ); INSERT INTO clickhouse_output SELECT id, name, age, rate FROM clickhouse_source;
-