Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:Connecteur ClickHouse

Dernière mise à jour :Aug 20, 2026

Cette rubrique explique comment utiliser le connecteur ClickHouse pour écrire des données dans ClickHouse.

Informations générales

ClickHouse est un système de gestion de base de données orienté colonne destiné au traitement analytique en ligne (OLAP). Pour plus d'informations, consultez la documentation Qu'est-ce que ClickHouse ?.

Le tableau suivant présente les fonctionnalités du connecteur ClickHouse.

Catégorie

Détails

Type pris en charge

Table de résultats uniquement

Mode d'exécution

Modes batch et streaming

Format de données

Non applicable

Métriques spécifiques au connecteur

  • numRecordsOut

  • numRecordsOutPerSecond

  • currentSendTime

Remarque

Pour plus d'informations sur ces métriques, consultez Métriques de surveillance.

Type d'API

SQL

Prise en charge de la mise à jour ou de la suppression de données dans une table de résultats

Le connecteur prend en charge les mises à jour et les suppressions si vous spécifiez une clé primaire dans la DDL de la table de résultats Flink et définissez le paramètre ignoreDelete sur false. Toutefois, cette option dégrade considérablement les performances.

Fonctionnalités

  • Écriture directe des données dans les tables locales d'une table distribuée ClickHouse.

  • Garantie de la sémantique exactly-once lors de l'écriture dans ClickHouse sur Alibaba Cloud E-MapReduce (EMR).

Prérequis

Limitations

  • Le paramètre sink.parallelism n'est pas pris en charge.

  • Par défaut, le puits ClickHouse offre une sémantique at-least-once.

  • Le connecteur ClickHouse est pris en charge uniquement dans Ververica Runtime (VVR) 3.0.2 et versions ultérieures.

  • L'option ignoreDelete est prise en charge uniquement dans VVR 3.0.3, VVR 4.0.7 et versions ultérieures.

  • Le type de données Nested de ClickHouse est pris en charge uniquement dans VVR 4.0.10 et versions ultérieures.

  • Les écritures directes dans les tables locales d'une table distribuée sont prises en charge uniquement dans VVR 4.0.11 et versions ultérieures.

  • La sémantique exactly-once pour l'écriture dans ClickHouse sur EMR est disponible uniquement dans VVR 4.0.11 et versions ultérieures. Toutefois, en raison de modifications des capacités du produit, cette sémantique n'est pas disponible pour ClickHouse sur EMR v3.45.1 et les versions supérieures à v5.11.1.

  • Le mode d'écriture balance, qui répartit uniformément les données sur les nœuds de table locale, est disponible uniquement dans VVR 8.0.7 et versions ultérieures.

  • L'écriture dans une table locale ClickHouse est prise en charge uniquement pour l'édition compatible avec ApsaraDB for ClickHouse Community.

  • Lorsque vous enregistrez un catalogue ClickHouse, le nom de la base de données par défaut ne peut pas contenir de trait d'union (-). Dans le cas contraire, la validation de l'URL JDBC échoue.

Syntaxe

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

Paramètres WITH

Paramètre

Description

Type

Obligatoire

Valeur par défaut

Remarques

connector

Le type de la table de résultats.

String

Oui

N/A

Définissez la valeur sur clickhouse.

url

L'URL JDBC de votre cluster ClickHouse.

String

Oui

N/A

Le format de l'URL est jdbc:clickhouse://<yourNetworkAddress>:<port>/<yourDatabaseName>. Lorsque vous écrivez directement dans une table locale, vous pouvez obtenir l'adresse IP du nœud en exécutant select * from system.clusters dans ClickHouse. Si vous ne spécifiez pas de nom de base de données, la base de données default est utilisée.

Remarque

Si vous souhaitez écrire des données dans une table distribuée ClickHouse, url doit être l'URL JDBC d'un nœud du cluster qui héberge la table distribuée.

userName

Le nom d'utilisateur pour accéder à ClickHouse.

String

Oui

N/A

N/A

password

Le mot de passe pour accéder à ClickHouse.

String

Oui

N/A

N/A

tableName

Le nom de la table ClickHouse.

String

Oui

N/A

N/A

maxRetryTimes

Le nombre maximal de tentatives après un échec d'insertion des données dans la table de résultats.

Int

Non

3

N/A

batchSize

Le nombre d'enregistrements à écrire en un seul lot.

Int

Non

100

Si le nombre d'entrées de données dans le cache atteint la valeur du paramètre batchSize ou si le temps d'attente dépasse flushIntervalMs, le système écrit automatiquement les données du cache dans la table ClickHouse.

flushIntervalMs

L'intervalle de temps, en millisecondes, pour vider le tampon.

Long

Non

1000

L'unité est la milliseconde.

ignoreDelete

Indique s'il faut ignorer les messages de suppression.

Boolean

Non

true

Valeurs valides :

  • true (par défaut) : Ignore les messages de suppression.

  • false : N'ignore pas les messages de suppression.

    Si cette option est définie sur false et qu'une clé primaire est définie dans la DDL, le connecteur utilise une instruction ALTER pour supprimer les données dans ClickHouse.

Remarque

Si vous définissez ignoreDelete sur false, vous ne pouvez pas utiliser le mode d'écriture partition.

shardWrite

Pour une table distribuée ClickHouse, indique s'il faut écrire les données directement dans les tables locales sous-jacentes.

Boolean

Non

false

Valeurs valides :

  • false (par défaut) : Le connecteur écrit les données dans la table distribuée, qui achemine ensuite les données vers les tables locales correspondantes. Le paramètre tableName doit être le nom de la table distribuée.

  • true : Le connecteur écrit les données directement dans les tables locales, en contournant la table distribuée.

    Cette option est recommandée pour améliorer le débit d'écriture.

    • Si vous souhaitez spécifier manuellement les tables locales dans lesquelles écrire via le paramètre url, tableName doit être le nom de la table locale. Exemple :

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002,192.XX.XX.2:3002/default'
          'tableName' = 'local_table'
    • Si vous ne souhaitez pas spécifier manuellement les nœuds, vous pouvez définir le paramètre inferLocalTable sur true pour permettre à Flink de découvrir automatiquement les nœuds de table locale. Dans ce cas, tableName doit être le nom de la table distribuée et url doit être l'URL JDBC d'un nœud du cluster. Exemple :

      'url' = 'jdbc:clickhouse://192.XX.XX.1:3002/default' // L'URL JDBC d'un nœud du cluster.
          'tableName' = 'distribute_table'

inferLocalTable

Lors de l'écriture dans une table distribuée ClickHouse, indique s'il faut découvrir automatiquement les tables locales sous-jacentes et y écrire directement.

Boolean

Non

false

Valeurs valides :

  • false (par défaut) : Si vous écrivez dans une table distribuée et ne spécifiez qu'un seul nœud dans le paramètre url, le connecteur ne tente pas de découvrir les tables locales. Il écrit dans la table distribuée, qui achemine ensuite les données vers les tables locales.

  • true : Flink tente de découvrir les tables locales et y écrit directement. Cela nécessite que shardWrite soit défini sur true, que tableName soit le nom de la table distribuée et que url soit l'URL JDBC d'un nœud du cluster.

Remarque

Ce paramètre est ignoré lors de l'écriture dans une table non distribuée.

writeMode

La stratégie d'écriture des données dans les tables locales d'une table distribuée.

Enum

Non

default

Valeurs valides :

  • default (par défaut) : Écrit toujours dans la table locale sur le premier nœud spécifié dans l'URL.

  • partition : Répartit les données en fonction d'une clé de partitionnement, garantissant que les enregistrements ayant la même clé sont écrits dans le même nœud de table locale.

  • random : Écrit les données dans un nœud de table locale sélectionné aléatoirement.

  • balance : Utilise une stratégie round-robin pour répartir uniformément les données sur tous les nœuds de table locale.

Remarque

Si vous définissez writeMode sur partition, vous devez définir ignoreDelete sur true.

shardingKey

La clé utilisée pour partitionner les données entre les nœuds de table locale.

String

Non

N/A

Lorsque writeMode est défini sur 'partition', le paramètre shardingKey est obligatoire. Il peut contenir plusieurs champs séparés par des virgules (,).

exactlyOnce

Indique s'il faut activer la sémantique exactly-once.

Boolean

Non

false

Valeurs valides :

  • true : Active la sémantique exactly-once.

  • false (par défaut) : Désactive la sémantique exactly-once.

Remarque
  • La sémantique exactly-once est prise en charge uniquement pour l'écriture dans ClickHouse sur EMR. Définissez ce paramètre sur true uniquement si votre puits est un cluster ClickHouse sur EMR.

  • La sémantique exactly-once n'est pas prise en charge pour l'écriture dans les tables locales ClickHouse avec la stratégie de partitionnement. Par conséquent, si exactlyOnce est défini sur true, writeMode ne peut pas être défini sur partition.

Mappage des types de données

Type Flink

Type ClickHouse

BOOLEAN

UInt8 / Boolean

Remarque

ClickHouse v21.12 et versions ultérieures prennent en charge le type Boolean. Pour les versions antérieures, le type BOOLEAN de Flink est mappé au type 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

Remarque

Le connecteur ClickHouse ne prend pas en charge les types TIME, MAP, MULTISET et ROW de Flink.

Pour utiliser le type de données Nested de ClickHouse, vous devez le mapper à un type ARRAY dans Flink. Par exemple :

-- ClickHouse
CREATE TABLE visits (
  StartDate Date,
  Goals Nested
  (
    ID UInt32,
    OrderID String
  )
  ...
);

Effectuez le mappage des types comme suit :

-- Flink
CREATE TABLE visits (
  StartDate DATE,
  `Goals.ID` ARRAY<LONG>,
  `Goals.OrderID` ARRAY<STRING>
);
Remarque

Dans les versions de VVR antérieures à 6.0.6, l'écriture de données DateTime64 avec le pilote JDBC officiel ClickHouse entraînait une perte de précision en tronquant les valeurs à la seconde. Par conséquent, seules les données TIMESTAMP avec une précision à la seconde, telles que TIMESTAMP(0), pouvaient être écrites avec succès. VVR 6.0.6 et versions ultérieures résolvent ce problème, permettant des écritures précises de données DateTime64.

Exemples

  • Exemple 1 : Écriture dans une table à nœud unique.

    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;
  • Exemple 2 : Écriture dans une table distribuée.

    Supposons qu'une table distribuée nommée distributed_table_test soit créée à partir de trois tables locales nommées local_table_test, situées sur les nœuds 192.XX.XX.1, 192.XX.XX.2 et 192.XX.XX.3.

    • Si vous souhaitez que Flink écrive les données directement dans les tables locales et partitionne les données par clé, utilisez la DDL suivante :

      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 vous souhaitez que Flink découvre automatiquement les nœuds de table locale au lieu de les spécifier manuellement dans l'URL, utilisez la DDL suivante :

      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;

FAQ