Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:Hologres : entrepôt de données en temps réel

Dernière mise à jour :Aug 13, 2026

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

Métriques de surveillance

  • Table source :

    • numRecordsIn

    • numRecordsInPerSecond

  • Table sink :

    • numRecordsOut

    • numRecordsOutPerSecond

    • currentSendTime

    Remarque

    Détails des métriques : Métriques de surveillance.

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

Consommation en temps réel des données Hologres

Permet de lire des données Hologres avec ou sans binlog, en mode CDC ou non-CDC.

Consommation complète et incrémentielle unifiée

Prend en charge la consommation complète, incrémentielle et complète et incrémentielle unifiée.

Gestion des conflits de clé primaire

Permet d'ignorer les nouvelles données, de remplacer des lignes entières ou de mettre à jour uniquement des champs spécifiques.

Fusion multi-stream et mises à jour partielles

Met à jour uniquement les colonnes modifiées au lieu de la ligne entière.

Consommer le binlog de tables partitionnées (Bêta)

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.

Écriture dans des tables partitionnées

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 :

  • Détection automatique de l'évolution du schéma de la table source : lorsque le schéma d'une table source change, Hologres synchronise ces modifications vers la table sink en temps réel.

  • Gestion automatique des changements de schéma : lors de l'ingestion de nouvelles données, Flink modifie d'abord le schéma de la table sink avant d'y écrire les données.

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_STREAM ou COPY_BULK_LOAD, les valeurs des colonnes de table utilisant CURRENT_TIMESTAMP ou NOW() 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 binlog hg_binlog_timestamp_us fournit 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.

    Important

    Si 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 holohub est obsolète dans Hologres 2,0 et versions ultérieures. Le système bascule automatiquement vers le mode jdbc, 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 jdbc est sélectionné avec les connexions légères activées par défaut (le paramètre connection.fixed.enabled est défini sur true).

    • Pour les versions Hologres comprises entre 2.1.0 et 2.1.26, le mode jdbc est sélectionné.

    • Pour Hologres 2,0 et versions antérieures, le mode holohub est sélectionné.

    Important

    Dans 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.

    Problèmes de permissions

    Si vous n'êtes pas superutilisateur, vous devez accorder les permissions nécessaires pour consommer les binlogs en mode JDBC.

    user_name correspond à l'ID de votre compte Alibaba Cloud ou utilisateur RAM (Présentation des comptes).

    -- In the standard PostgreSQL authorization model, grant the CREATE permission to the user and grant the replication role on the instance to the user.
    GRANT CREATE ON DATABASE <db_name> TO <user_name>;
    alter role <user_name> replication;
    
    -- If the database uses the simple permission model (SLMP), you cannot run the GRANT statement. Use spm_grant to grant the Admin permission on the database to the user. You can also grant the permission in the HoloWeb console.
    call spm_grant('<db_name>_admin', '<user_name>');
    alter role <user_name> replication;

    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 mode jdbc_fixed et 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 mode jdbc_fixed et définit 'deduplication.enabled'='false' pour empêcher la déduplication.

    Important
    • Le service rpc est obsolète dans Hologres 2,0 et versions ultérieures. Si vous définissez ce paramètre sur rpc, Flink bascule automatiquement la valeur vers jdbc_fixed. Si vous attribuez une autre valeur au paramètre, Flink utilise la valeur spécifiée.

    • Le mode rpc a été supprimé à partir de VVR 11,1. Nous recommandons d'utiliser le mode jdbc pour les connexions.

    • Pour les opérations d'écriture dans des scénarios à haute concurrence, nous vous conseillons d'utiliser le mode jdbc_copy ou COPY_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 rpc est obsolète pour les instances Hologres version 2,0 ou ultérieure. Si vous définissez ce paramètre sur rpc, Flink bascule automatiquement la valeur vers jdbc_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é

    Important

    Le mode rpc a été supprimé à partir de VVR 11,1. Par défaut, le mode jdbc est utilisé pour les connexions. Vous pouvez également activer le mode de connexion légère en définissant le paramètre connection.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 UPDATE génère deux enregistrements binlog consécutifs : l'enregistrement update_before pour les anciennes données, suivi de l'enregistrement update_after pour les nouvelles données.

  • Évitez d'exécuter des opérations TRUNCATE ou 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 DECIMAL soit cohérente entre Flink et Hologres afin d'éviter des erreurs. Pour plus d'informations, consultez la FAQ.

  • Lorsque vous utilisez le mode initial pour 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.

Remarque

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+

Important

À 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.
  );
Remarque
  • Définissez source.binlog.startup-mode sur INITIAL pour effectuer une lecture initiale complète de la table avant de passer à la consommation incrémentielle du Binlog.

  • Si le paramètre startTime est défini, soit directement, soit en sélectionnant une heure de début dans l'interface de démarrage, il est prioritaire. Il configure alors binlogStartUpMode en mode timestamp, remplaçant ainsi les autres paramètres de mode, car le paramètre startTime possè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.
  );
Remarque
  • Définissez binlogStartUpMode sur initial afin d'effectuer une lecture initiale complète de la table avant de basculer vers la consommation incrémentielle du Binlog.

  • Lorsque le paramètre startTime est 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 mode binlogStartUpMode passe alors automatiquement en timestamp, 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.
Remarque

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.

Remarque
  • À 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 partitionRouter sur true.

  • Pour autoriser la création automatique d'une partition enfant manquante par le connecteur, passez createparttable à true.

Remarque
  • 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;
Remarque

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.

    Important
    • En 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_precreate doit ê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

Important

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+

Important

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();
    }
}
Important

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 :

  • 5 : message INSERT.

  • 2 : message DELETE.

  • 3 : image de la ligne avant une opération UPDATE.

  • 7 : image de la ligne après une opération UPDATE.

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