Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Conector de ClickHouse

Última actualización: Sep 03, 2026

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

  • numRecordsOut

  • numRecordsOutPerSecond

  • currentSendTime

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 ignoreDelete en false. Sin embargo, esta opción reduce significativamente el rendimiento.

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.

    Nota

    Para 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.parallelism no 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 ignoreDelete solo 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 jdbc:clickhouse://<yourNetworkAddress>:<port>/<yourDatabaseName>. Al escribir directamente en una tabla local, puede obtener la dirección IP del nodo ejecutando select * from system.clusters en ClickHouse. Si no especifica un nombre de base de datos, se utiliza la base de datos default.

Nota

Si desea escribir datos en una tabla distribuida de ClickHouse, url debe ser la URL JDBC de un nodo en el clúster que aloja la tabla distribuida.

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:

  • true (predeterminado): Ignora los mensajes de eliminación.

  • false: No ignora los mensajes de eliminación.

    Si esta opción se establece en false y se define una clave primaria en la DDL, el conector utiliza una sentencia ALTER para eliminar datos en ClickHouse.

Nota

Si establece ignoreDelete en false, no podrá utilizar el modo de escritura partition.

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:

  • false (predeterminado): El conector escribe datos en la tabla distribuida, la cual enruta posteriormente los datos a las tablas locales correspondientes. El parámetro tableName debe ser el nombre de la tabla distribuida.

  • true: El conector escribe datos directamente en las tablas locales, omitiendo la tabla distribuida.

    Se recomienda esta opción para mejorar el throughput de escritura.

    • Si desea especificar manualmente en qué tablas locales escribir mediante la url, el tableName debe ser el nombre de la tabla local. Ejemplo:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002/default'
          'tableName' = 'local_table'
    • Si no desea especificar manualmente los nodos, puede establecer el parámetro inferLocalTable en true para permitir que Flink descubra automáticamente los nodos de la tabla local. En este caso, tableName debe ser el nombre de la tabla distribuida y url debe ser la URL JDBC de un nodo en el clúster. Ejemplo:

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default' // The JDBC URL of a node in the cluster.
          'tableName' = 'distribute_table'

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:

  • false (predeterminado): Si escribe en una tabla distribuida y especifica solo un nodo en el parámetro url, el conector no intentará descubrir las tablas locales. Escribirá en la tabla distribuida, la cual enruta posteriormente los datos a las tablas locales.

  • true: Flink intenta descubrir las tablas locales y escribe directamente en ellas. Esto requiere que shardWrite esté establecido en true, que tableName sea el nombre de la tabla distribuida y que url sea la URL JDBC de un nodo en el clúster.

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:

  • default (predeterminado): Siempre escribe en la tabla local del primer nodo especificado en la URL.

  • partition: Distribuye los datos según una clave de particionamiento, garantizando que los registros con la misma clave se escriban en el mismo nodo de tabla local.

  • random: Escribe datos en un nodo de tabla local seleccionado aleatoriamente.

  • balance: Utiliza una estrategia round-robin para distribuir uniformemente los datos entre todos los nodos de la tabla local.

Nota

Si establece writeMode en partition, debe establecer ignoreDelete en true.

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:

  • true: Habilita la semántica exactly-once.

  • false (predeterminado): Deshabilita la semántica exactly-once.

Nota
  • La semántica exactly-once solo es compatible para escribir en ClickHouse en EMR. Establezca este parámetro en true únicamente si su sink es un clúster de ClickHouse en EMR.

  • La semántica exactly-once no es compatible para escribir en tablas locales de ClickHouse con la estrategia de particionamiento. Por lo tanto, si exactlyOnce se establece en true, writeMode no puede establecerse en partition.

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

Nota

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>
);
Nota

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;

Preguntas frecuentes