Le connecteur Hologres permet de lire et d'écrire dans des tables Hologres en mode stream et batch. Il prend en charge le CDC, la consommation de binlogs ainsi que les mises à jour partielles.
Présentation
Hologres est un entrepôt de données en temps réel unifié qui prend en charge le langage SQL standard (compatible PostgreSQL), l'OLAP à l'échelle du pétaoctet, l'analyse ad hoc et le service de données à haute concurrence et faible latence. Il s'intègre à MaxCompute, Realtime Compute for Apache Flink et DataWorks. Le tableau suivant décrit les capacités du connecteur.
|
Catégorie |
Description |
|
Types pris en charge |
Tables source, de dimension et sink |
|
Mode d'exécution |
Modes stream et batch |
|
Format des données |
Non pris en charge |
|
Métriques de surveillance spécifiques |
|
|
Types d'API |
DataStream et SQL |
|
Prise en charge des mises à jour ou suppressions de données dans les tables sink |
Oui |
Fonctionnalités
|
Fonctionnalité |
Description |
|
Permet de lire des données Hologres avec ou sans binlog, en mode CDC ou non-CDC. |
|
|
Prend en charge la consommation complète, incrémentielle et complète et incrémentielle unifiée. |
|
|
Permet d'ignorer les nouvelles données, de remplacer des lignes entières ou de mettre à jour uniquement des champs spécifiques. |
|
|
Met à jour uniquement les colonnes modifiées au lieu de la ligne entière. |
|
|
Prend en charge la consommation de binlogs depuis des tables partitionnées physiques et logiques. Pour les tables partitionnées physiques, un seul job peut surveiller toutes les partitions, y compris celles ajoutées ultérieurement. |
|
|
Permet d'écrire dans une table parente pour créer automatiquement les partitions enfants correspondantes. |
|
|
Synchronisation en temps réel d'une table unique ou d'une base de données entière |
Assure la synchronisation en temps réel d'une table unique ou d'une base de données complète, avec les fonctionnalités clés suivantes :
Pour plus d'informations, consultez Instruction CREATE TABLE AS (CTAS) (en cours de retrait) et Démarrage rapide pour la synchronisation de bases de données en temps réel. |
Limites et recommandations
Limites
Tables externes non prises en charge : le connecteur Hologres ne prend pas en charge les tables externes Hologres, telles que les tables externes MaxCompute.
Restriction sur le type temporel : le connecteur Hologres ne prend actuellement pas en charge la consommation en temps réel des données de type
TIMESTAMP. Lors de la création de tables, utilisez exclusivement le type TIMESTAMPTZ.Mode de balayage de la table source (Ververica Runtime (VVR) 8 et versions antérieures) : par défaut, le connecteur lit les données en mode batch et n'effectue qu'un seul balayage complet de la table. Par conséquent, il ne consomme pas les données ajoutées ultérieurement.
Restriction sur les watermarks (Ververica Runtime (VVR) 8 et versions antérieures) : le mode CDC ne prend pas en charge les définitions de watermarks. Pour effectuer une agrégation fenêtrée, utilisez plutôt une solution d'agrégation non fenêtrée.
Comportement des fonctions temporelles en mode COPY : lorsque vous utilisez le mode d'écriture
COPY_STREAMouCOPY_BULK_LOAD, les valeurs des colonnes de table utilisantCURRENT_TIMESTAMPouNOW()comme valeur par défaut sont fixées à l'heure de début de la connexion et ne sont pas mises à jour pour chaque ligne. La colonne de métadonnées binloghg_binlog_timestamp_usfournit l'heure réelle d'ingestion.
Recommandations
-
Choix du format de stockage :
Pour les recherches ponctuelles dans une table de dimensions : optez pour le stockage orienté ligne. Vous devez définir une clé primaire et une clé de clustering.
Pour les requêtes un-à-plusieurs sur des tables de dimensions : privilégiez le stockage orienté colonne. Pour des performances optimales, configurez correctement la clé de distribution et la clé de segment.
Pour les tables nécessitant des mises à jour fréquentes et des requêtes analytiques : si une table doit prendre en charge à la fois la consommation de binlogs en temps réel et l'analyse OLAP, nous recommandons vivement d'utiliser le stockage hybride ligne-colonne.
ImportantSi vous ne spécifiez pas de format de stockage lors de la création d'une table dans Hologres, le système applique par défaut le stockage orienté colonne. Le format de stockage ne peut plus être modifié après la création de la table. Créer une table dans Hologres | Formats de stockage des tables : orienté ligne, orienté colonne et hybride ligne-colonne.
-
Paramètres de parallélisme des jobs : définissez le parallélisme du job Flink pour qu'il corresponde au nombre de shards de la table Hologres.
-- In HoloWeb, run the following statement to find the number of shards in a table. Replace <tablename> with your table name. select tg.property_value from hologres.hg_table_properties tb join hologres.hg_table_group_properties tg on tb.property_value = tg.tablegroup_name where tb.property_key = 'table_group' and tg.property_key = 'shard_count' and table_name = '<tablename>'; Versions et fonctionnalités : consultez régulièrement les notes de version du connecteur Hologres pour connaître les problèmes connus, les mises à jour de fonctionnalités et les informations de compatibilité des versions.
Remarques d'utilisation
-
Compatibilité et limites des modes de consommation Hologres et VVR
Table source
Pour VVR 8 et les versions antérieures, sélectionnez le mode de consommation à l'aide du paramètre
sdkMode.À partir de VVR 11, sélectionnez le mode de consommation via le paramètre
source.binlog.read-mode.
Version VVR
Version Hologres
Valeur par défaut/recommandée
Mode de consommation réel
Notes
≥ 6.0.7
< 2,0
Personnalisé
holohub (par défaut)
Nous recommandons de définir la valeur sur
jdbc.6.0.7 à 8.0.4
≥ 2,0
jdbc (basculement automatique, aucune configuration requise)
jdbc (forcé)
Le service
holohubest obsolète dans Hologres 2,0 et versions ultérieures. Le système bascule automatiquement vers le modejdbc, ce qui peut entraîner des problèmes de permissions. Pour la configuration des permissions, consultez Problèmes de permissions.≥ 8.0.5
≥ 2,1
jdbc (basculement automatique, aucune configuration requise)
jdbc (forcé)
Aucun problème de permissions. Pour Hologres 2.1.27 et versions ultérieures, le mode bascule vers
jdbc_fixed.≥ 11,1
Toute version
AUTO (par défaut)
Sélectionné automatiquement selon la version Hologres
-
Pour Hologres 2.1.27 et versions ultérieures, le mode
jdbcest sélectionné avec les connexions légères activées par défaut (le paramètreconnection.fixed.enabledest défini surtrue). -
Pour les versions Hologres comprises entre 2.1.0 et 2.1.26, le mode
jdbcest sélectionné. -
Pour Hologres 2,0 et versions antérieures, le mode
holohubest sélectionné.
ImportantDans VVR 11,1 et versions ultérieures, le connecteur consomme les données binlog par défaut. Assurez-vous d'avoir activé le binlog. Dans le cas contraire, des erreurs peuvent survenir.
Table sink
Pour VVR 8 et les versions antérieures, sélectionnez le mode d'écriture des données à l'aide du paramètre
sdkMode.À partir de VVR 11, sélectionnez le mode d'écriture des données via le paramètre
sink.write-mode.
Version VVR
Version Hologres
Mode RPC affecté
Mode d'écriture réel
Valeur par défaut/recommandée
Notes
6.0.4 à 8.0.2
< 2,0
Non
rpc
Personnalisé
N/A
6.0.4 à 8.0.2
≥ 2,0
Oui
jdbc_fixed (basculement automatique)
Personnalisé
Pour éviter la déduplication, définissez 'jdbcWriteBatchSize'='1'.
≥ 8.0.3
Toute version
Oui
jdbc_fixed (basculement automatique)
Personnalisé
Si vous configurez le mode sur
rpc, le système bascule automatiquement vers le modejdbc_fixedet définit 'jdbcWriteBatchSize'='1' pour empêcher la déduplication.≥ 8.0.5
Toute version
Oui
jdbc_fixed (basculement automatique)
Personnalisé
Si vous configurez le mode sur
rpc, le système bascule automatiquement vers le modejdbc_fixedet définit 'deduplication.enabled'='false' pour empêcher la déduplication.ImportantLe service
rpcest obsolète dans Hologres 2,0 et versions ultérieures. Si vous définissez ce paramètre surrpc, Flink bascule automatiquement la valeur versjdbc_fixed. Si vous attribuez une autre valeur au paramètre, Flink utilise la valeur spécifiée.Le mode
rpca été supprimé à partir de VVR 11,1. Nous recommandons d'utiliser le modejdbcpour les connexions.Pour les opérations d'écriture dans des scénarios à haute concurrence, nous vous conseillons d'utiliser le mode
jdbc_copyouCOPY_STREAM.
Table de dimensions
Version VVR
Version Hologres
Mode RPC affecté
Mode de consommation réel
Valeur par défaut/recommandée
Notes
6.0.4 à 8.0.2
< 2,0
Non
rpc
Personnalisé
N/A
6.0.4 à 8.0.2
≥ 2,0
Oui
jdbc_fixed (basculement automatique)
Personnalisé
Le service
rpcest obsolète pour les instances Hologres version 2,0 ou ultérieure. Si vous définissez ce paramètre surrpc, Flink bascule automatiquement la valeur versjdbc_fixed. Toutefois, si vous attribuez une autre valeur au paramètre, Flink utilise la valeur que vous avez spécifiée.≥ 8.0.3
Toute version
Oui
jdbc_fixed (basculement automatique)
Personnalisé
≥ 8.0.5
Toute version
Oui
jdbc_fixed (basculement automatique)
Personnalisé
ImportantLe mode
rpca été supprimé à partir de VVR 11,1. Par défaut, le modejdbcest utilisé pour les connexions. Vous pouvez également activer le mode de connexion légère en définissant le paramètreconnection.fixed.enabled. -
Pour lire des données JSONB depuis une table source binlog en mode JDBC, vous devez activer un paramètre GUC au niveau de la base de données.
-- Enable the GUC parameter at the database level. Only a superuser can execute this command. You need to run this command only once for each database. alter database <db_name> set hg_experimental_enable_binlog_jsonb = on; Une opération
UPDATEgénère deux enregistrements binlog consécutifs : l'enregistrementupdate_beforepour les anciennes données, suivi de l'enregistrementupdate_afterpour les nouvelles données.Évitez d'exécuter des opérations
TRUNCATEou d'autres opérations de reconstruction de table sur une table source binlog. Pour plus d'informations, consultez la FAQ.Veillez à ce que la précision du type
DECIMALsoit cohérente entre Flink et Hologres afin d'éviter des erreurs. Pour plus d'informations, consultez la FAQ.Lorsque vous utilisez le mode
initialpour une consommation unifiée complète et incrémentielle des données d'une table source, l'ordre global n'est pas garanti. Si les systèmes en aval dépendent de calculs basés sur le temps, utilisez un autre mode de consommation réservé aux binlogs.
Activer le binlog
Pour les nouvelles tables
La fonctionnalité de lecture de données en temps réel est désactivée par défaut. Par conséquent, lorsque vous créez une table dans HoloWeb à l'aide d'une instruction DDL, vous devez définir les paramètres binlog.level et binlog.ttl. Voici un exemple.
begin;
create table test_table(
id int primary key,
title text not null,
body text);
call set_table_property('test_table', 'orientation', 'row');--Create a row-oriented table named test_table.
call set_table_property('test_table', 'clustering_key', 'id');--Create a clustering key on the id column.
call set_table_property('test_table', 'binlog.level', 'replica');--Enable the binlog feature.
call set_table_property('test_table', 'binlog.ttl', '86400');--Set the time-to-live (TTL) for the binlog in seconds.
commit;
Pour les tables existantes
Dans HoloWeb, vous pouvez utiliser l'instruction suivante pour activer le binlog d'une table existante et définir son TTL. table_name correspond au nom de la table pour laquelle vous souhaitez activer le binlog.
-- Enable the binlog feature.
begin;
call set_table_property('<table_name>', 'binlog.level', 'replica');
commit;
-- Set the binlog time-to-live (TTL) in seconds.
begin;
call set_table_property('<table_name>', 'binlog.ttl', '2592000');
commit;
Paramètres WITH
VVR 11 a renommé ou supprimé certaines options du connecteur Hologres, tout en restant rétrocompatible avec VVR 8. Reportez-vous à la documentation des paramètres correspondant à votre version.
Mappage des types
Pour le mappage des types de données entre Flink et Hologres, consultez Mappage des types de données entre Flink et Hologres.
Hologres prend en charge la syntaxe GENERATED ALWAYS AS pour définir une colonne générée. Exemple :
ds TIMESTAMP NOT NULL GENERATED ALWAYS AS (date_trunc('month', create_time)) STORED
La contrainte NOT NULL sur une colonne générée est mappée à un champ nullable, conformément au comportement attendu. Étant donné que la valeur d'une colonne générée est calculée par Hologres, Flink n'écrit pas de valeur pour ce champ. Si la contrainte NOT NULL était conservée, l'opération d'écriture échouerait lors de la validation dans le client Hologres. Ce comportement n'affecte pas la contrainte NOT NULL sur une colonne standard (par exemple, ds TIMESTAMP NOT NULL).
Exemples
Exemples de tables sources
Table source binlog
Mode CDC
Dans ce mode, la source consomme les données binlog et définit automatiquement le type RowKind Flink approprié pour chaque ligne en fonction du hg_binlog_event_type, sans nécessiter de déclarations explicites. Ces types incluent INSERT, DELETE, UPDATE_BEFORE et UPDATE_AFTER. Cela permet la réplication des données de la table, similaire à la fonctionnalité Change Data Capture (CDC) dans des bases de données telles que MySQL ou PostgreSQL. Voici un exemple de DDL pour la table source.
VVR 11+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password'='${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog.change-log-mode'='ALL', --Reads all changelog types, including INSERT, DELETE, UPDATE_BEFORE, and UPDATE_AFTER.
'retry-count'='10', --The number of retries on a binlog read error.
'retry-sleep-step-ms'='5000', --The incremental backoff time between retries. The first retry waits 5 seconds, the second waits 10 seconds, and so on.
'source.binlog.batch-size'='512' --The batch size for reading binlog data.
);
VVR 8+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'cdcMode' = 'true',
'sdkMode'='jdbc',
'binlogMaxRetryTimes' = '10', --The number of retries on a binlog read error.
'binlogRetryIntervalMs' = '500', --The retry interval in milliseconds after a binlog read error.
'binlogBatchReadSize' = '100' --The batch size for reading binlog data.
);
Mode non-CDC
Dans ce mode, la source transmet les données binlog consommées aux nœuds en aval sous forme de données Flink standard, en traitant tous les enregistrements comme étant de type INSERT. Vous pouvez gérer les enregistrements avec un hg_binlog_event_type spécifique en fonction de vos besoins métier. Voici un exemple de DDL pour la table source.
VVR 11+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog.change-log-mode'='ALL_AS_APPEND_ONLY', --All changelog types are treated as INSERT operations.
'retry-count'='10', --The number of retries on a binlog read error.
'retry-sleep-step-ms'='5000', --The incremental backoff time between retries. The first retry waits 5 seconds, the second waits 10 seconds, and so on.
'source.binlog.batch-size'='512' --The batch size for reading binlog data.
);
VVR 8+
CREATE TEMPORARY TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'binlogMaxRetryTimes' = '10', --The number of retries on a binlog read error.
'binlogRetryIntervalMs' = '500', --The retry interval in milliseconds after a binlog read error.
'binlogBatchReadSize' = '100' --The batch size for reading binlog data.
);
Table source sans binlog
VVR 11+
À partir de VVR 11,1, le connecteur consomme les données binlog par défaut. Pour lire depuis une table source sans binlog, vous devez explicitement définir 'source.binlog' sur 'false'. Pour plus d'informations, consultez Table source binlog.
CREATE TEMPORARY TABLE hologres_source (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'source.binlog'='false' --Specifies whether to consume binlog data.
);
VVR 8+
CREATE TEMPORARY TABLE hologres_source (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', --Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'sdkMode' = 'jdbc'
);
Table sink
CREATE TEMPORARY TABLE datagen_source(
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='datagen'
);
CREATE TEMPORARY TABLE hologres_sink (
name varchar,
age BIGINT,
birthday BIGINT
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- Use variable management to prevent AK/SK key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>'
);
INSERT INTO hologres_sink SELECT * from datagen_source;
Exemple de table de dimensions
CREATE TEMPORARY TABLE datagen_source (
a INT,
b BIGINT,
c STRING,
proctime AS PROCTIME()
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE hologres_dim (
a INT,
b VARCHAR,
c VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username' = '${secret_values.ak_id}', -- Use variables for your AccessKey pair to prevent key leakage.
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>'
);
CREATE TEMPORARY TABLE blackhole_sink (
a INT,
b STRING
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink SELECT T.a,H.b
FROM datagen_source AS T JOIN hologres_dim FOR SYSTEM_TIME AS OF T.proctime AS H ON T.a = H.a;
Fonctionnalités avancées
Ingestion unifiée complète et incrémentielle
Cas d'usage
Cette fonctionnalité s'applique uniquement aux tables source possédant une clé primaire. Elle est recommandée pour les tables source Hologres utilisant le mode CDC.
Hologres permet d'activer le Binlog à la demande. Vous pouvez activer le Binlog sur des tables existantes contenant déjà des données.
Exemple de code
VVR 11+
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'source.binlog.startup-mode' = 'INITIAL', --Reads all historical data, then incrementally consumes the Binlog.
'retry-count'='10', --Number of retries if an error occurs while reading Binlog data.
'retry-sleep-step-ms'='5000', --Incremental wait time between retries. The first retry waits 5 seconds, the second waits 10 seconds, and so on.
'source.binlog.batch-size'='512' --Number of rows to read from the Binlog in a single batch.
);
Définissez
source.binlog.startup-modesurINITIALpour effectuer une lecture initiale complète de la table avant de passer à la consommation incrémentielle du Binlog.Si le paramètre
startTimeest défini, soit directement, soit en sélectionnant une heure de début dans l'interface de démarrage, il est prioritaire. Il configure alorsbinlogStartUpModeen modetimestamp, remplaçant ainsi les autres paramètres de mode, car le paramètrestartTimepossède une priorité supérieure.
VVR 8+
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn BIGINT,
hg_binlog_event_type BIGINT,
hg_binlog_timestamp_us BIGINT,
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourTablename>',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'binlog' = 'true',
'cdcMode' = 'true',
'binlogStartUpMode' = 'initial', --Reads all historical data, then incrementally consumes the Binlog.
'binlogMaxRetryTimes' = '10', --Number of retries if an error occurs while reading Binlog data.
'binlogRetryIntervalMs' = '500', --Retry interval in milliseconds after a Binlog read error.
'binlogBatchReadSize' = '100' --Number of rows to read from the Binlog in a single batch.
);
Définissez
binlogStartUpModesurinitialafin d'effectuer une lecture initiale complète de la table avant de basculer vers la consommation incrémentielle du Binlog.Lorsque le paramètre
startTimeest spécifié, que ce soit directement ou via la sélection d'une heure de début dans l'interface, il prévaut sur les autres configurations. Le modebinlogStartUpModepasse alors automatiquement entimestamp, car ce paramètre bénéficie d'une priorité plus élevée.
Résolution des conflits de clés primaires
Le connecteur propose trois stratégies pour gérer les doublons de clés primaires lors de l'écriture.
VVR 11+
Spécifiez une stratégie en définissant le paramètre sink.on-conflict-action.
|
Valeur |
Description |
|
INSERT_OR_IGNORE |
Conserve le premier enregistrement arrivé et ignore les doublons suivants. |
|
INSERT_OR_REPLACE |
Remplace l'enregistrement existant par le nouveau. |
|
INSERT_OR_UPDATE (par défaut) |
Met à jour uniquement les colonnes fournies dans la table sink, sans modifier les autres colonnes de l'enregistrement existant. |
VVR 8+
Configurez une stratégie en ajustant le paramètre mutatetype.
|
Valeur |
Description |
|
insertorignore (par défaut) |
Conserve le premier enregistrement reçu et ignore les doublons ultérieurs. |
|
insertorreplace |
Écrase l'enregistrement existant avec les nouvelles données. |
|
insertorupdate |
Actualise seulement les colonnes présentes dans la table sink, laissant inchangées les autres colonnes de l'enregistrement cible. |
Par exemple, si une table comporte les colonnes a, b, c et d, où a est la clé primaire, et que la table sink ne fournit que les colonnes a et b, définir la stratégie sur INSERT_OR_UPDATE mettra à jour uniquement la colonne b. Les colonnes c et d resteront inchangées.
Cependant, toute colonne de la table physique omise dans la table sink doit accepter les valeurs NULL. Dans le cas contraire, l'opération d'écriture échouera.
Écriture dans des tables partitionnées
Par défaut, le sink Hologres écrit les données dans une table unique non partitionnée. Pour écrire dans une table partitionnée en ciblant sa table parente, activez les options suivantes.
VVR 11+
Pour permettre au connecteur de créer automatiquement une partition enfant si elle n'existe pas, définissez sink.create-missing-partition sur true.
À partir de VVR 11,1, l'écriture dans des tables partitionnées est prise en charge par défaut et les données sont automatiquement routées vers les partitions enfants appropriées.
Définissez le paramètre tablename sur le nom de la table parente.
Si une partition enfant requise n'existe pas et que sink.create-missing-partition=true n'est pas configuré, l'écriture échouera.
VVR 8+
Afin de router automatiquement les données vers les partitions enfants correspondantes, réglez
partitionRoutersurtrue.Pour autoriser la création automatique d'une partition enfant manquante par le connecteur, passez
createparttableàtrue.
Renseignez le nom de la table parente dans le paramètre tablename.
L'absence d'une partition enfant nécessaire, combinée à l'omission du paramètre createparttable=true, provoquera l'échec de l'écriture.
Fusion de flux et mises à jour partielles
Lors de l'écriture de plusieurs flux dans une seule table large Hologres, le connecteur fusionne les enregistrements partageant la même clé primaire. Les mises à jour partielles ne modifient que les colonnes concernées au lieu de remplacer toute la ligne, ce qui améliore les performances d'écriture et la cohérence des données.
Limites
La table large doit posséder une clé primaire.
Chaque flux de données doit inclure toutes les colonnes constituant la clé primaire.
Pour les tables larges utilisant un stockage orienté colonne, la fusion de flux à un taux élevé de requêtes par seconde (RPS) peut entraîner une forte utilisation du CPU. Pour atténuer ce phénomène, envisagez de désactiver l'encodage par dictionnaire pour les colonnes de la table.
Exemple
Supposons que vous disposiez de deux flux de données Flink. Le premier contient les colonnes a, b et c, tandis que le second comprend les colonnes a, d et e. La table large Hologres, nommée WIDE_TABLE, regroupe les colonnes a, b, c, d et e, la colonne a servant de clé primaire.
VVR 11+
// source1 and source2 are already defined.
CREATE TEMPORARY TABLE hologres_sink ( -- Declare columns a, b, c, d, and e.
a BIGINT,
b STRING,
c STRING,
d STRING,
e STRING,
primary key(a) not enforced
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourWideTablename>', -- The Hologres wide table, which contains columns a, b, c, d, and e.
'username' = '${secret_values.ak_id}',
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'sink.on-conflict-action'='INSERT_OR_UPDATE', -- Update specific columns based on the primary key.
'sink.delete-strategy'='IGNORE_DELETE', -- Strategy for handling retraction messages. IGNORE_DELETE is suitable for append-only or upsert streams where delete operations are not required.
'sink.partial-insert.enabled'='true' -- Enables partial updates. Only the columns specified in the INSERT statement are sent to the connector.
);
BEGIN STATEMENT SET;
INSERT INTO hologres_sink(a,b,c) select * from source1; -- Declare that only columns a, b, and c are inserted.
INSERT INTO hologres_sink(a,d,e) select * from source2; -- Declare that only columns a, d, and e are inserted.
END;
VVR 8+
// source1 and source2 are already defined.
CREATE TEMPORARY TABLE hologres_sink ( -- Declare columns a, b, c, d, and e.
a BIGINT,
b STRING,
c STRING,
d STRING,
e STRING,
primary key(a) not enforced
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='<yourWideTablename>', -- The Hologres wide table, which contains columns a, b, c, d, and e.
'username' = '${secret_values.ak_id}',
'password' = '${secret_values.ak_secret}',
'endpoint'='<yourEndpoint>',
'mutatetype'='insertorupdate', -- Update specific columns based on the primary key.
'ignoredelete'='true', -- Ignore DELETE requests generated by retraction messages.
'partial-insert.enabled'='true' -- Enable partial updates to update only the columns declared in the INSERT statement.
);
BEGIN STATEMENT SET;
INSERT INTO hologres_sink(a,b,c) select * from source1; -- Declare that only columns a, b, and c are inserted.
INSERT INTO hologres_sink(a,d,e) select * from source2; -- Declare that only columns a, d, and e are inserted.
END;
Activez ignoredelete en le positionnant sur true pour ignorer les requêtes Delete générées par les messages de rétractation. Pour VVR 8.0.8 et versions ultérieures, nous recommandons d'utiliser sink.delete-strategy afin de configurer diverses stratégies pour les mises à jour partielles.
Consommation du binlog depuis des tables partitionnées (Bêta)
Le connecteur Hologres prend en charge la consommation du binlog à partir de tables partitionnées physiques et logiques. Pour connaître leurs différences, consultez CREATE LOGICAL PARTITION TABLE.
Consommation du binlog depuis des tables partitionnées physiques
Le connecteur Hologres peut consommer le binlog d'une table partitionnée et surveiller dynamiquement les nouvelles partitions au sein d'un seul job. Cela améliore considérablement l'efficacité et la facilité d'utilisation du traitement des données en temps réel.
Remarques d'utilisation
Cette fonctionnalité est disponible uniquement pour les tables source binlog en mode JDBC. Elle nécessite VVR 8.0.11 ou version ultérieure ainsi qu'une instance Hologres version 2.1.27 ou supérieure.
-
Le nom de la partition doit respecter la convention de nommage du partitionnement dynamique :
{parent_table}_{partition_value}. Les partitions non conformes risquent de ne pas être consommées.ImportantEn mode DYNAMIC, la version VVR 8.0.11 ne prend pas en charge les colonnes de partition utilisant un délimiteur
-(comme AAAA-MM-JJ).Depuis VVR 11,1, la consommation de données issues de colonnes de partition avec un format personnalisé est possible.
Cette restriction ne s'applique pas lors de l'écriture dans des tables partitionnées.
Lors de la déclaration d'une table source Hologres dans Flink, vous devez inclure ses colonnes de partition.
En mode DYNAMIC, le partitionnement dynamique doit être activé sur la table partitionnée. De plus, le paramètre de pré-création de partition
auto_partitioning.num_precreatedoit être supérieur à 1. Sinon, le job lèvera une exception lors de la tentative de consommation de la dernière partition.En mode DYNAMIC, après l'ajout d'une nouvelle partition, le connecteur cesse de consommer les modifications de données ultérieures provenant des anciennes partitions.
Exemples
|
Mode |
Fonctionnalités |
Description |
|
DYNAMIC |
consommation dynamique de partitions |
Surveille et consomme automatiquement les nouvelles partitions par ordre chronologique. Ce mode convient aux scénarios de streaming de données en temps réel. |
|
STATIC |
consommation statique de partitions |
Consomme uniquement les partitions existantes (ou spécifiées manuellement) sans découvrir automatiquement les nouvelles. Idéal pour traiter des données historiques sur une plage fixe. |
Dynamic mode
VVR 11+
Supposons qu'une table partitionnée Hologres soit créée avec le DDL suivant, avec le binlog et le partitionnement dynamique activés.
CREATE TABLE "test_message_src1" (
id int,
title text,
body text,
dt text,
PRIMARY KEY (id, dt)
)
PARTITION BY LIST (dt) WITH (
binlog_level = 'replica',
auto_partitioning_enable = 'true', -- Enables dynamic partitioning.
auto_partitioning_time_unit = 'DAY', -- Partitions are created daily. Example partition names: test_message_src1_20250512, test_message_src1_20250513.
auto_partitioning_num_precreate = '2' -- Pre-creates two partitions.
);
-- For an existing partitioned table, you can also enable dynamic partitioning using ALTER TABLE.
Dans Flink, utilisez l'instruction SQL suivante pour consommer la table partitionnée test_message_src1 en mode DYNAMIC.
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
dt VARCHAR -- The partition column of the Hologres partitioned table.
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src1', -- The parent table for which dynamic partitioning is enabled.
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'source.binlog.partition-binlog-mode' = 'DYNAMIC', -- Dynamically monitors the latest partitions.
'source.binlog.startup-mode' = 'initial' -- Consumes all existing data, then consumes incremental data from the binlog.
);
VVR 8.0.11
Imaginons qu'une table partitionnée Hologres ait été créée via le DDL ci-dessous, avec activation du binlog et du partitionnement dynamique.
CREATE TABLE "test_message_src1" (
id int,
title text,
body text,
dt text,
PRIMARY KEY (id, dt)
)
PARTITION BY LIST (dt) WITH (
binlog_level = 'replica',
auto_partitioning_enable = 'true', -- Enables dynamic partitioning.
auto_partitioning_time_unit = 'DAY', -- Partitions are created daily. Example partition names: test_message_src1_20241027, test_message_src1_20241028.
auto_partitioning_num_precreate = '2' -- Pre-creates two partitions.
);
-- For an existing partitioned table, you can also enable dynamic partitioning using ALTER TABLE.
Dans Flink, exécutez la requête SQL suivante pour consommer les données de la table partitionnée test_message_src1 en mode DYNAMIC.
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
dt VARCHAR -- The partition column of the Hologres partitioned table.
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src1', -- The parent table for which dynamic partitioning is enabled.
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'binlog' = 'true',
'partition-binlog.mode' = 'DYNAMIC', -- Dynamically monitors the latest partitions.
'binlogstartUpMode' = 'initial', -- Consumes all existing data, then consumes incremental data from the binlog.
'sdkMode' = 'jdbc_fixed' -- Use this mode to avoid connection limit issues.
);
Static mode
VVR 11+
Prenons l'exemple d'une table partitionnée Hologres créée avec le DDL suivant, où le binlog est activé.
CREATE TABLE test_message_src2 (
id int,
title text,
body text,
color text,
PRIMARY KEY (id, color)
)
PARTITION BY LIST (color) WITH (
binlog_level = 'replica'
);
create table test_message_src2_red partition of test_message_src2 for values in ('red');
create table test_message_src2_blue partition of test_message_src2 for values in ('blue');
create table test_message_src2_green partition of test_message_src2 for values in ('green');
create table test_message_src2_black partition of test_message_src2 for values in ('black');
Dans Flink, servez-vous de l'instruction SQL ci-après pour consommer la table partitionnée test_message_src2 en mode STATIC.
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
color VARCHAR -- The partition column of the Hologres partitioned table.
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src2', -- The partitioned table.
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'source.binlog.partition-binlog-mode' = 'STATIC', -- Consumes a fixed set of partitions.
'source.binlog.partition-values-to-read' = 'red,blue,green', -- Consumes only the three specified partitions. The 'black' partition is not consumed. New partitions are also not consumed. If this option is not set, the job consumes all partitions of the parent table.
'source.binlog.startup-mode' = 'initial' -- Consumes all existing data, then consumes incremental data from the binlog.
);
VVR 8.0.11
Considérons une table partitionnée Hologres définie par le DDL suivant, avec le binlog actif.
CREATE TABLE test_message_src2 (
id int,
title text,
body text,
color text,
PRIMARY KEY (id, color)
)
PARTITION BY LIST (color) WITH (
binlog_level = 'replica'
);
create table test_message_src2_red partition of test_message_src2 for values in ('red');
create table test_message_src2_blue partition of test_message_src2 for values in ('blue');
create table test_message_src2_green partition of test_message_src2 for values in ('green');
create table test_message_src2_black partition of test_message_src2 for values in ('black');
Dans Flink, appliquez la commande SQL suivante pour lire les données de la table partitionnée test_message_src2 en mode STATIC.
CREATE TEMPORARY TABLE hologres_source
(
id INTEGER,
title VARCHAR,
body VARCHAR,
color VARCHAR -- The partition column of the Hologres partitioned table.
)
with (
'connector' = 'hologres',
'dbname' = '<yourDatabase>',
'tablename' = 'test_message_src2', -- The partitioned table.
'username' = '<yourUserName>',
'password' = '<yourPassword>',
'endpoint' = '<yourEndpoint>',
'binlog' = 'true',
'partition-binlog.mode' = 'STATIC', -- Consumes a fixed set of partitions.
'partition-values-to-read' = 'red,blue,green', -- Consumes only the three specified partitions. The 'black' partition is not consumed. New partitions are also not consumed. If this option is not set, the job consumes all partitions of the parent table.
'binlogstartUpMode' = 'initial', -- Consumes all existing data, then consumes incremental data from the binlog.
'sdkMode' = 'jdbc_fixed' -- Use this mode to avoid connection limit issues.
);
Consommation du binlog depuis des tables partitionnées logiques
Le connecteur Hologres permet de consommer le binlog des tables partitionnées logiques et offre des options pour préciser les partitions à consommer.
Remarques d'utilisation
La consommation du binlog depuis des partitions spécifiques d'une table partitionnée logique requiert VVR 11.0.0 ou version ultérieure et une instance Hologres V3.1 ou supérieure.
La consommation du binlog de toutes les partitions d'une table partitionnée logique suit la même approche que pour une table non partitionnée (Tables source).
Exemples
|
Paramètre |
Description |
Exemple |
|
source.binlog.logical-partition-filter-column-names |
Noms des colonnes de partition déterminant les partitions à consommer. Placez les noms de colonnes entre guillemets doubles ("). Séparez plusieurs noms par des virgules (,). Échappez tout guillemet double contenu dans un nom par un guillemet supplémentaire. |
'source.binlog.logical-partition-filter-column-names'='"Pt","id"' Deux colonnes de partition sont utilisées : Pt et id. |
|
source.binlog.logical-partition-filter-column-values |
Valeurs de partition identifiant les partitions à consommer. Une partition est définie par un ensemble de valeurs, une pour chaque colonne de partition. Entourez chaque valeur de guillemets doubles ("). Séparez les valeurs d'une même partition par une virgule (,) et les partitions entre elles par un point-virgule (;). Échappez tout guillemet double interne par un guillemet supplémentaire. |
'source.binlog.logical-partition-filter-column-values'='"20240910","0";"special""value","9"' Cela spécifie deux partitions à consommer. La première a pour valeur (20240910, 0) et la seconde (special"value, 9). |
Supposons que vous ayez créé la table suivante dans Hologres.
CREATE TABLE holo_table (
id int not null,
name text,
age numeric(18,4),
"Pt" text,
primary key(id, "Pt")
)
LOGICAL PARTITION BY LIST ("Pt", id)
WITH (
binlog_level ='replica'
);
Pour consommer le binlog de cette table dans Flink :
CREATE TEMPORARY TABLE test_src_binlog_table(
id INTEGER,
name VARCHAR,
age decimal(18,4),
`Pt` VARCHAR
) WITH (
'connector'='hologres',
'dbname'='<yourDbname>',
'tablename'='holo_table',
'username'='<yourAccessID>',
'password'='<yourAccessSecret>',
'endpoint'='<yourEndpoint>',
'source.binlog'='true',
'source.binlog.logical-partition-filter-column-names'='"Pt","id"',
'source.binlog.logical-partition-filter-column-values'='<yourPartitionColumnValues>',
'source.binlog.change-log-mode'='ALL', --Reads all changelog types, including INSERT, DELETE, UPDATE_BEFORE, and UPDATE_AFTER.
'retry-count'='10', -- The number of retries for binlog read errors.
'retry-sleep-step-ms'='5000', --The incremental backoff time between retries. The first retry waits 5 seconds, the second waits 10 seconds, and so on.
'source.binlog.batch-size'='512' --The number of rows to read from the binlog in a single batch.
);
DataStream API
Pour lire ou écrire dans Hologres via l'API DataStream, configurez le connecteur DataStream correspondant (Utilisation des connecteurs DataStream). Le connecteur DataStream Hologres est disponible sur Maven Central. Pour le débogage local, utilisez l'Uber JAR (Exécution et débogage locaux de jobs contenant des connecteurs).
Table source Hologres
Binlog source table
VVR fournit la classe HologresBinlogSource pour lire les données binlog Hologres. L'exemple suivant montre comment construire une source binlog Hologres.
VVR 11.3+
Depuis VVR 11.1.2, les paramètres JDBCOptions et startTimeMs ont été retirés du constructeur HologresBinlogSource. À partir de VVR 11.3, un paramètre List<Subscribe.BinlogFilter> a été ajouté. Si vous utilisez VVR 11 ou une version ultérieure, nous recommandons d'opter pour VVR 11.3 ou supérieur.
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to read. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// The name of the table to read.
String sourceTableName = "sourceTableName";
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, sourceTableName);
config.set(HologresConfigs.BINLOG, true);
config.set(HologresConfigs.BINLOG_CHANGE_LOG_MODE, BinlogChangeLogMode.ALL);
// Build the Hologres binlog source.
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
StartupMode.INITIAL,
sourceTableName,
"",
Collections.emptyList(),
-1,
Collections.emptySet(),
Collections.emptyList()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 8.0.11+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to read. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// Build JDBCOptions.
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// Build the Hologres binlog source.
long startTimeMs = 0;
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.INITIAL,
"",
"",
-1,
Collections.emptySet(),
new ArrayList<>()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 8.0.7+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to read. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// Build JDBCOptions.
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// Build the Hologres binlog source.
long startTimeMs = 0;
HologresBinlogSource source = new HologresBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.INITIAL,
"",
"",
-1,
Collections.emptySet()
);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
VVR 6.0.7+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to read. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
config.setBoolean(HologresBinlogConfigs.OPTIONAL_BINLOG, true);
config.setBoolean(HologresBinlogConfigs.BINLOG_CDC_MODE, true);
// Build JDBCOptions.
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
// Set or create the default slot name.
config.setString(HologresBinlogConfigs.JDBC_BINLOG_SLOT_NAME, HoloBinlogUtil.getOrCreateDefaultSlotForJDBCBinlog(jdbcOptions));
boolean cdcMode = config.get(HologresBinlogConfigs.BINLOG_CDC_MODE) && config.get(HologresBinlogConfigs.OPTIONAL_BINLOG);
// Build the JDBCBinlogRecordConverter.
JDBCBinlogRecordConverter recordConverter = new JDBCBinlogRecordConverter(
jdbcOptions.getTable(),
schema,
new HologresConnectionParam(config),
cdcMode,
Collections.emptySet());
// Build the Hologres binlog source.
long startTimeMs = 0;
HologresJDBCBinlogSource source = new HologresJDBCBinlogSource(
new HologresConnectionParam(config),
schema,
config,
jdbcOptions,
startTimeMs,
StartupMode.TIMESTAMP,
recordConverter,
"",
-1);
env.fromSource(source, WatermarkStrategy.noWatermarks(), "Test source").print();
env.execute();
}
}
Si vous utilisez une version du moteur Flink antérieure à 8.0.5 ou une version Hologres antérieure à 2,1, assurez-vous que l'utilisateur est superutilisateur ou dispose du rôle Replication (Problèmes d'autorisations Hologres).
Non-binlog source table
VVR fournit la classe HologresBulkreadInputFormat, une implémentation de RichInputFormat, pour lire les données des tables Hologres. L'exemple suivant illustre la construction d'une source Hologres.
public class Sample {
public static void main(String[] args) throws Exception {
// set up the Java DataStream API
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to read. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.field("c", DataTypes.TIMESTAMP())
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
// Build JDBCOptions.
JDBCOptions jdbcOptions = JDBCUtils.getJDBCOptions(config);
HologresBulkreadInputFormat inputFormat = new HologresBulkreadInputFormat(
new HologresConnectionParam(config),
jdbcOptions,
schema,
"",
-1);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(schema.toRowDataType().getLogicalType());
env.addSource(new InputFormatSourceFunction<>(inputFormat, typeInfo)).returns(typeInfo).print();
env.execute();
}
}
Maven dependency
Le connecteur DataStream Hologres est disponible sur Maven Central.
<dependency>
<groupId>com.alibaba.ververica</groupId>
<artifactId>ververica-connector-hologres</artifactId>
<version>${vvr-version}</version>
</dependency>
Table sink Hologres
VVR 11+
public class Sample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to write to. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema tableSchema = TableSchema.builder()
.field("a", DataTypes.INT().notNull())
.field("b", DataTypes.STRING())
.primaryKey("a")
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.set(HologresConfigs.ENDPOINT, "yourEndpoint");
config.set(HologresConfigs.USERNAME, "yourUserName");
config.set(HologresConfigs.PASSWORD, "yourPassword");
config.set(HologresConfigs.DATABASE, "yourDatabaseName");
config.set(HologresConfigs.TABLE, "yourTableName");
HologresConnectionParam connectionParam = new HologresConnectionParam(config);
HologresTableSchema hologresTableSchema =
HologresTableSchema.get(connectionParam.getJDBCOptions());
// The indexes of the columns to write to the sink.
Integer[] targetColumnIndexes = {0, 1};
// Build the Hologres sink.
HologresSinkFunction sinkFunction =
new HologresSinkFunction(
connectionParam, tableSchema, targetColumnIndexes, hologresTableSchema);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(tableSchema.toRowDataType().getLogicalType());
env.fromElements((RowData) GenericRowData.of(101, StringData.fromString("name"))).returns(typeInfo).addSink(sinkFunction);
env.execute();
}
}
VVR 8+
public class Sample {
public static void main(String[] args) throws Exception {
// set up the Java DataStream API
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// Initialize the schema for the table to write to. The schema must match the fields of the Hologres table schema. You can define a subset of the fields.
TableSchema schema = TableSchema.builder()
.field("a", DataTypes.INT())
.field("b", DataTypes.STRING())
.build();
// Parameters for the Hologres connection.
Configuration config = new Configuration();
config.setString(HologresConfigs.ENDPOINT, "yourEndpoint");
config.setString(HologresConfigs.USERNAME, "yourUserName");
config.setString(HologresConfigs.PASSWORD, "yourPassword");
config.setString(HologresConfigs.DATABASE, "yourDatabaseName");
config.setString(HologresConfigs.TABLE, "yourTableName");
config.setString(HologresConfigs.SDK_MODE, "jdbc");
HologresConnectionParam hologresConnectionParam = new HologresConnectionParam(config);
// Build a Hologres writer to write data as RowData.
AbstractHologresWriter<RowData> hologresWriter = HologresJDBCWriter.createRowDataWriter(
hologresConnectionParam,
schema,
HologresTableSchema.get(hologresConnectionParam),
new Integer[0]);
// Build the Hologres sink.
HologresSinkFunction sinkFunction = new HologresSinkFunction(hologresConnectionParam, hologresWriter);
TypeInformation<RowData> typeInfo = InternalTypeInfo.of(schema.toRowDataType().getLogicalType());
env.fromElements((RowData) GenericRowData.of(101, StringData.fromString("name"))).returns(typeInfo).addSink(sinkFunction);
env.execute();
}
}
Colonnes de métadonnées
À partir de la version VVR 8.0.11, les colonnes de métadonnées sont prises en charge dans les tables source binlog. Déclarez des champs binlog tels que hg_binlog_event_type en tant que colonnes de métadonnées afin d'accéder au nom de la base de données source, au nom de la table, au type de modification et à l'horodatage de l'événement pour vos logiques personnalisées (par exemple, le filtrage des événements DELETE).
|
Paramètre |
Type |
Description |
|
db_name |
STRING NOT NULL |
Nom de la base de données contenant la ligne. |
|
table_name |
STRING NOT NULL |
Nom de la table contenant la ligne. |
|
hg_binlog_lsn |
BIGINT NOT NULL |
Champ système correspondant au numéro de séquence du journal binaire. La valeur augmente de manière monotone, mais non contiguë, au sein d'un shard. L'unicité et l'ordre ne sont pas garantis entre les shards. |
|
hg_binlog_timestamp_us |
BIGINT NOT NULL |
Horodatage de l'événement de modification dans la base de données, exprimé en microsecondes (us). |
|
hg_binlog_event_type |
BIGINT NOT NULL |
Type de modification appliqué à la ligne. Les valeurs valides sont :
|
|
hg_shard_id |
INT NOT NULL |
ID du shard de données contenant la ligne (groupe de tables et shard). |
Dans une instruction DDL, déclarez une colonne de métadonnées à l'aide de la syntaxe <meta_column_name> <datatype> METADATA VIRTUAL. Voici un exemple :
CREATE TABLE test_message_src_binlog_table(
hg_binlog_lsn bigint METADATA VIRTUAL
hg_binlog_event_type bigint METADATA VIRTUAL
hg_binlog_timestamp_us bigint METADATA VIRTUAL
hg_shard_id int METADATA VIRTUAL
db_name string METADATA VIRTUAL
table_name string METADATA VIRTUAL
id INTEGER,
title VARCHAR,
body VARCHAR
) WITH (
'connector'='hologres',
...
);
FAQ
Références
Pour créer et utiliser des catalogues Hologres, consultez la rubrique Gérer les catalogues Hologres.
Hologres s'intègre à Flink pour offrir une solution unifiée de construction d'entrepôts de données en temps réel. Pour plus de détails, reportez-vous à Construire un entrepôt de données en temps réel avec Hologres.
Grâce à ses capacités efficaces de mise à jour et de correction des données, Hologres est particulièrement adapté à la création de tables larges dans des scénarios d'écriture multi-flux. Consultez l'exemple suivant : Analyse du comportement utilisateur avec Flink, MongoDB et Hologres.