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 |
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 |
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
Créez une table ClickHouse. Pour plus d'informations, consultez Créer une nouvelle table.
-
Configurez une liste d'autorisation.
Si vous utilisez ApsaraDB for ClickHouse, consultez Configurer une liste d'autorisation.
Si vous utilisez ClickHouse sur Alibaba Cloud E-MapReduce (EMR), consultez Gérer les groupes de sécurité.
Si vous utilisez un cluster ClickHouse auto-géré sur une instance ECS, consultez Présentation des groupes de sécurité.
Pour toutes les autres configurations, configurez la liste d'autorisation sur la machine où ClickHouse est déployé afin d'autoriser l'accès depuis le déploiement Realtime Compute for Apache Flink.
RemarquePour afficher le segment de réseau vSwitch pour Realtime Compute for Apache Flink, consultez Comment configurer une liste d'autorisation ?.
Limitations
Le paramètre
sink.parallelismn'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
ignoreDeleteest 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 Remarque
Si vous souhaitez écrire des données dans une table distribuée ClickHouse, |
|
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 :
Remarque
Si vous définissez |
|
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 :
|
|
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 :
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 :
Remarque
Si vous définissez |
|
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 :
Remarque
|
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 |
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>
);
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;
-