Este tema describe cómo utilizar el conector de ClickHouse para escribir datos en ClickHouse.
Contexto
ClickHouse es un sistema de gestión de bases de datos orientado a columnas diseñado para el procesamiento analítico en línea (OLAP). Para obtener más información, consulte ¿Qué es ClickHouse?.
La siguiente tabla describe las capacidades del conector de ClickHouse.
|
Categoría |
Detalles |
|
Tipo compatible |
Solo tabla de resultados |
|
Modo de ejecución |
Modos por lotes y streaming |
|
Formato de datos |
No aplicable |
|
Métricas específicas del conector |
Nota
Para obtener más información sobre estas métricas, consulte Monitoring metrics. |
|
Tipo de API |
SQL |
|
Compatibilidad con actualización o eliminación de datos en una tabla de resultados |
El conector admite actualizaciones y eliminaciones si se especifica una clave primaria en la DDL de la tabla de resultados de Flink y se establece el parámetro |
Funciones
Escritura directa de datos en las tablas locales de una tabla distribuida de ClickHouse.
Garantía de semántica exactly-once al escribir en ClickHouse en Alibaba Cloud E-MapReduce (EMR).
Requisitos previos
Cree una tabla de ClickHouse. Para obtener más información, consulte Crear una nueva tabla.
-
Configure una lista de permitidos.
Si utiliza ApsaraDB for ClickHouse, consulte Configure a whitelist.
Si utiliza ClickHouse en Alibaba Cloud E-MapReduce (EMR), consulte Manage security groups.
Si utiliza un clúster de ClickHouse autogestionado en una instancia ECS, consulte Security group overview.
Para cualquier otra configuración, configure la lista de permitidos en la máquina donde se despliega ClickHouse para permitir el acceso desde el despliegue de Realtime Compute for Apache Flink.
NotaPara consultar el segmento de red del vSwitch de Realtime Compute for Apache Flink, consulte How do I configure a whitelist?.
Limitaciones
El parámetro
sink.parallelismno es compatible.De forma predeterminada, el sink de ClickHouse ofrece semántica at-least-once.
El conector de ClickHouse solo es compatible con Ververica Runtime (VVR) 3.0.2 y versiones posteriores.
La opción
ignoreDeletesolo es compatible con VVR 3.0.3, VVR 4.0.7 y versiones posteriores.El tipo de datos Nested de ClickHouse solo es compatible con VVR 4.0.10 y versiones posteriores.
La escritura directa en las tablas locales de una tabla distribuida solo es compatible con VVR 4.0.11 y versiones posteriores.
La semántica exactly-once para escribir en ClickHouse en EMR solo está disponible en VVR 4.0.11 y versiones posteriores. No obstante, debido a cambios en las capacidades del producto, esta semántica no está disponible para ClickHouse en EMR v3.45.1 ni en versiones posteriores a la v5.11.1.
El modo de escritura
balance, que distribuye los datos uniformemente entre los nodos de la tabla local, solo está disponible en VVR 8.0.7 y versiones posteriores.La escritura en una tabla local de ClickHouse solo es compatible con ApsaraDB for ClickHouse Community-compatible Edition.
Al registrar un catálogo de ClickHouse, el nombre de la base de datos predeterminada no puede contener un guion (
-). De lo contrario, la validación de la URL JDBC fallará.
Sintaxis
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 |
Descripción |
Tipo |
Obligatorio |
Predeterminado |
Observaciones |
|
connector |
El tipo de la tabla de resultados. |
String |
Sí |
N/A |
Establezca el valor en clickhouse. |
|
url |
La URL JDBC de su clúster de ClickHouse. |
String |
Sí |
N/A |
El formato de la URL es Nota
Si desea escribir datos en una tabla distribuida de ClickHouse, |
|
userName |
El nombre de usuario para acceder a ClickHouse. |
String |
Sí |
N/A |
N/A |
|
password |
La contraseña para acceder a ClickHouse. |
String |
Sí |
N/A |
N/A |
|
tableName |
El nombre de la tabla de ClickHouse. |
String |
Sí |
N/A |
N/A |
|
maxRetryTimes |
El número máximo de reintentos tras un intento fallido de inserción de datos en la tabla de resultados. |
Int |
No |
3 |
N/A |
|
batchSize |
El número de registros que se escribirán en un solo lote. |
Int |
No |
100 |
Si la cantidad de entradas de datos en la caché alcanza el valor del parámetro batchSize o si el tiempo de espera supera flushIntervalMs, el sistema escribe automáticamente los datos de la caché en la tabla de ClickHouse. |
|
flushIntervalMs |
El intervalo de tiempo, en milisegundos, para vaciar el búfer. |
Long |
No |
1000 |
La unidad es milisegundos. |
|
ignoreDelete |
Especifica si se deben ignorar los mensajes de eliminación. |
Boolean |
No |
true |
Valores válidos:
Nota
Si establece |
|
shardWrite |
Para una tabla distribuida de ClickHouse, especifica si se deben escribir los datos directamente en las tablas locales subyacentes. |
Boolean |
No |
false |
Valores válidos:
|
|
inferLocalTable |
Al escribir en una tabla distribuida de ClickHouse, especifica si se deben descubrir automáticamente las tablas locales subyacentes y escribir directamente en ellas. |
Boolean |
No |
false |
Valores válidos:
Nota
Este parámetro se ignora al escribir en una tabla no distribuida. |
|
writeMode |
La estrategia para escribir datos en las tablas locales de una tabla distribuida. |
Enum |
No |
default |
Valores válidos:
Nota
Si establece |
|
shardingKey |
La clave utilizada para particionar datos entre los nodos de la tabla local. |
String |
No |
N/A |
Cuando writeMode se establece en 'partition', el parámetro shardingKey es obligatorio. Puede contener varios campos separados por comas (,). |
|
exactlyOnce |
Especifica si se debe habilitar la semántica exactly-once. |
Boolean |
No |
false |
Valores válidos:
Nota
|
Mapeo de tipos de datos
|
Tipo de Flink |
Tipo de ClickHouse |
|
BOOLEAN |
UInt8 / Boolean Nota
ClickHouse v21.12 y versiones posteriores admiten el tipo Boolean. En versiones anteriores, el tipo BOOLEAN de Flink se asigna al tipo UInt8 de 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 |
El conector de ClickHouse no admite los tipos TIME, MAP, MULTISET y ROW de Flink.
Para utilizar el tipo de datos Nested de ClickHouse, debe asignarlo a un tipo ARRAY en Flink. Por ejemplo:
-- ClickHouse
CREATE TABLE visits (
StartDate Date,
Goals Nested
(
ID UInt32,
OrderID String
)
...
);
Asigne los tipos de la siguiente manera:
-- Flink
CREATE TABLE visits (
StartDate DATE,
`Goals.ID` ARRAY<LONG>,
`Goals.OrderID` ARRAY<STRING>
);
En versiones de VVR anteriores a la 6.0.6, escribir datos DateTime64 con el controlador JDBC oficial de ClickHouse provocaba una pérdida de precisión al truncar los valores al segundo. Como resultado, solo los datos TIMESTAMP con precisión de segundos, como TIMESTAMP(0), podían escribirse correctamente. VVR 6.0.6 y versiones posteriores resuelven este problema, lo que permite escrituras precisas de datos DateTime64.
Ejemplos
-
Ejemplo 1: Escritura en una tabla de nodo ú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; -
Ejemplo 2: Escritura en una tabla distribuida.
Suponga que se crea una tabla distribuida llamada distributed_table_test a partir de tres tablas locales llamadas local_table_test, ubicadas en los nodos 192.XX.XX.1, 192.XX.XX.2 y 192.XX.XX.3.
-
Si desea que Flink escriba datos directamente en las tablas locales y particione los datos mediante una clave, utilice la siguiente 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; -
Si desea que Flink descubra automáticamente los nodos de la tabla local en lugar de especificarlos manualmente en la URL, utilice la siguiente 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;
-