Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Conector SQL de Hologres

Última actualización: Sep 08, 2026

Utilice el conector de Hologres para leer y escribir datos en tablas de Hologres en modos de flujo y por lotes. Este conector es compatible con CDC, el consumo de binlog y las actualizaciones parciales.

Descripción general

Hologres es un almacén de datos unificado en tiempo real que admite SQL estándar (compatible con PostgreSQL), OLAP a escala de petabytes, análisis ad hoc y entrega de datos de alta concurrencia y baja latencia. Se integra con MaxCompute, Realtime Compute for Apache Flink y DataWorks. A continuación se describen las funciones del conector.

Categoría

Descripción

Tipos compatibles

Tablas de origen, de dimensión y de destino

Modo de ejecución

Modos de flujo y por lotes

Formato de datos

No compatible

Métricas de monitoreo específicas

Métricas de monitoreo

  • Tabla de origen:

    • numRecordsIn

    • numRecordsInPerSecond

  • Tabla de destino:

    • numRecordsOut

    • numRecordsOutPerSecond

    • currentSendTime

    Nota

    Detalles de las métricas: Monitoring metrics.

Tipos de API

DataStream y SQL

Admite actualizaciones o eliminaciones de datos en tablas de destino

Sí

Funciones

Función

Descripción

Real-time consumption of Hologres data

Permite leer datos de Hologres con o sin binlog, tanto en modo CDC como fuera de este.

Unified full and incremental consumption

Admite el consumo completo, incremental y unificado (completo e incremental).

Primary key conflict handling

Permite ignorar datos nuevos, reemplazar filas completas o actualizar únicamente campos específicos.

Multi-stream merge and partial updates

Actualiza solo las columnas modificadas en lugar de la fila completa.

Consume binlog from partitioned tables (Beta)

Admite el consumo de binlog desde tablas particionadas físicas y lógicas. En las tablas particionadas físicas, un solo trabajo puede monitorear todas las particiones, incluidas las recién agregadas.

Write to partitioned tables

Permite escribir en una tabla padre para crear automáticamente las particiones hijas correspondientes.

Sincronización en tiempo real de una sola tabla o de una base de datos completa

Admite la sincronización en tiempo real de una sola tabla o de una base de datos completa. Sus funciones principales son las siguientes:

  • Detección automática de cambios en el esquema de la tabla de origen: cuando el esquema de una tabla de origen cambia, Hologres sincroniza estos cambios con la tabla de destino en tiempo real.

  • Gestión automática de los cambios de esquema: al ingresar datos nuevos, Flink modifica primero el esquema de la tabla de destino antes de escribirlos.

Para obtener más información, consulte Quick Start for real-time database synchronization.

Limitaciones y recomendaciones

Limitaciones

  • Las tablas externas no son compatibles: el conector de Hologres no es compatible con Hologres foreign tables, como las tablas externas de MaxCompute.

  • Restricción del tipo de tiempo: actualmente, el conector de Hologres no admite el consumo en tiempo real de datos de tipo TIMESTAMP. Al crear tablas, utilice exclusivamente el tipo TIMESTAMPTZ****.

  • Modo de escaneo de la tabla de origen (Ververica Runtime (VVR) 8 y versiones anteriores): de forma predeterminada, el conector lee datos en modo por lotes y escanea la tabla completa solo una vez. Por lo tanto, no consume los datos recién agregados.

  • Restricción de marcas de agua (Ververica Runtime (VVR) 8 y versiones anteriores): el modo CDC no admite definiciones de marcas de agua. Para ejecutar agregaciones con ventanas, utilice un non-windowed aggregation solution.

  • Comportamiento de las funciones de tiempo en modo COPY: cuando utiliza el modo de escritura COPY_STREAM o COPY_BULK_LOAD, los valores de las columnas de la tabla que usan CURRENT_TIMESTAMP o NOW() como valor predeterminado quedan fijos en la hora de inicio de la conexión y no se actualizan por cada fila. La columna de metadatos de binlog hg_binlog_timestamp_us proporciona la hora real de ingreso de los datos.

Recomendaciones

  • Selección del formato de almacenamiento:

    • Para búsquedas puntuales en tablas de dimensiones: utilice el almacenamiento orientado a filas. Debe establecer una clave primaria y una clave de agrupación en clúster.

    • Para consultas de uno a varios en tablas de dimensiones: utilice el almacenamiento orientado a columnas. Para obtener un rendimiento óptimo, configure correctamente distribution key y segment key.

    • Para tablas que requieren actualizaciones frecuentes y consultas analíticas: si una tabla debe admitir tanto el consumo de binlog en tiempo real como el análisis OLAP, se recomienda encarecidamente utilizar el almacenamiento híbrido de filas y columnas.

    Importante

    Si no especifica un formato de almacenamiento al crear una tabla en Hologres, se utiliza de forma predeterminada el almacenamiento orientado a columnas. No es posible cambiar el formato de almacenamiento después de crear la tabla. Create a Table in Hologres | Table Storage Formats: Row-oriented, Column-oriented, and Row-column Hybrid.

  • Configuración del paralelismo del trabajo: establezca el paralelismo del trabajo de Flink para que coincida con la cantidad de shards de la tabla de 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>';
  • Versiones y funciones: revise periódicamente Hologres connector Release Notes para consultar problemas conocidos, actualizaciones de funciones e información de compatibilidad entre versiones.

Notas de uso

  • Compatibilidad y limitaciones de los modos de consumo de Hologres y VVR

    Tabla de origen

    • En VVR 8 y versiones anteriores, seleccione el modo de consumo mediante el parámetro sdkMode.

    • En VVR 11 y versiones posteriores, seleccione el modo de consumo mediante el parámetro source.binlog.read-mode.

    Versión de VVR

    Versión de Hologres

    Valor predeterminado o recomendado

    Modo de consumo real

    Notas

    ≥ 6.0.7

    < 2.0

    Personalizado

    holohub (predeterminado)

    Se recomienda establecer el valor en jdbc.

    De 6.0.7 a 8.0.4

    ≥ 2.0

    jdbc (cambio automático, no requiere configuración)

    jdbc (forzado)

    El servicio holohub está obsoleto en Hologres 2.0 y versiones posteriores. El sistema cambia automáticamente al modo jdbc, lo cual podría generar problemas de permisos. Para configurar los permisos, consulte Permission issues.

    ≥ 8.0.5

    ≥ 2.1

    jdbc (cambio automático, no requiere configuración)

    jdbc (forzado)

    Sin problemas de permisos. En Hologres 2.1.27 y versiones posteriores, el modo cambia a jdbc_fixed.

    ≥ 11.1

    Cualquier versión

    AUTO (predeterminado)

    Seleccionado automáticamente según la versión de Hologres

    • En Hologres 2.1.27 y versiones posteriores, se selecciona el modo jdbc con conexiones ligeras habilitadas de forma predeterminada (el parámetro connection.fixed.enabled se establece en true).

    • En las versiones de Hologres de la 2.1.0 a la 2.1.26, se selecciona el modo jdbc.

    • En Hologres 2.0 y versiones anteriores, se selecciona el modo holohub.

    Importante

    En VVR 11.1 y versiones posteriores, el conector consume datos de binlog de forma predeterminada. Asegúrese de contar con enabled binlog. De lo contrario, podrían producirse errores.

    Problemas de permisos

    Si no es superusuario, debe otorgar los permisos necesarios para consumir binlogs en modo JDBC.

    user_name es el identificador de su cuenta de Alibaba Cloud o usuario de RAM (Account overview).

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

    Tabla de destino

    • En VVR 8 y versiones anteriores, seleccione el modo de escritura de datos mediante el parámetro sdkMode.

    • En VVR 11 y versiones posteriores, seleccione el modo de escritura de datos mediante el parámetro sink.write-mode.

    Versión de VVR

    Versión de Hologres

    Modo RPC afectado

    Modo de escritura real

    Valor predeterminado o recomendado

    Notas

    De 6.0.4 a 8.0.2

    < 2.0

    No

    rpc

    Personalizado

    N/D

    De 6.0.4 a 8.0.2

    ≥ 2.0

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    Para evitar la deduplicación, establezca 'jdbcWriteBatchSize'='1'.

    ≥ 8.0.3

    Cualquier versión

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    Si configura el modo como rpc, el sistema cambia automáticamente al modo jdbc_fixed y establece 'jdbcWriteBatchSize'='1' para evitar la deduplicación.

    ≥ 8.0.5

    Cualquier versión

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    Si configura el modo como rpc, el sistema cambia automáticamente al modo jdbc_fixed y establece 'deduplication.enabled'='false' para evitar la deduplicación.

    Importante
    • El servicio rpc está obsoleto en Hologres 2.0 y versiones posteriores. Si establece este parámetro en rpc, Flink cambia automáticamente el valor a jdbc_fixed. Si le asigna un valor distinto, Flink utiliza el valor especificado.

    • El modo rpc se eliminó en VVR 11.1 y versiones posteriores. Se recomienda utilizar el modo jdbc para las conexiones.

    • Para operaciones de escritura en escenarios de alta concurrencia, se recomienda usar el modo jdbc_copy o COPY_STREAM.

    Tabla de dimensiones

    Versión de VVR

    Versión de Hologres

    Modo RPC afectado

    Modo de consumo real

    Valor predeterminado o recomendado

    Notas

    De 6.0.4 a 8.0.2

    < 2.0

    No

    rpc

    Personalizado

    N/D

    De 6.0.4 a 8.0.2

    ≥ 2.0

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    El servicio rpc está obsoleto en instancias de Hologres de la versión 2.0 o posterior. Si establece este parámetro en rpc, Flink cambia automáticamente el valor a jdbc_fixed. Sin embargo, si le asigna un valor distinto, Flink utiliza el valor que usted especificó.

    ≥ 8.0.3

    Cualquier versión

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    ≥ 8.0.5

    Cualquier versión

    Sí

    jdbc_fixed (cambio automático)

    Personalizado

    Importante

    El modo rpc se eliminó en VVR 11.1 y versiones posteriores. De forma predeterminada, se utiliza el modo jdbc para las conexiones. También puede habilitar el modo de conexión ligera mediante el parámetro connection.fixed.enabled.

  • Para leer datos de JSONB desde una tabla de origen de binlog en modo JDBC, debe habilitar un parámetro GUC a nivel de base de datos.

    -- 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;
  • Una operación UPDATE genera dos registros de binlog consecutivos: el registro update_before para los datos antiguos, seguido del registro update_after para los datos nuevos.

  • Evite ejecutar TRUNCATE u otras operaciones de reconstrucción de tablas en una tabla de origen de binlog. Para obtener más información, consulte FAQ.

  • Asegúrese de que la precisión del tipo DECIMAL sea consistente entre Flink y Hologres para evitar errores. Para obtener más información, consulte FAQ.

  • Cuando utiliza el modo initial para el consumo unificado de datos completos e incrementales desde una tabla de origen, no se garantiza el orden global. Si los sistemas descendentes dependen de cálculos basados en tiempo, utilice un modo de consumo diferente que use únicamente binlog.

Habilitar binlog

Para tablas nuevas

La función de lectura de datos en tiempo real está deshabilitada de forma predeterminada. Por lo tanto, al crear una tabla en HoloWeb mediante una instrucción DDL, debe establecer los parámetros binlog.level y binlog.ttl. A continuación se muestra un ejemplo.

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;

Para tablas existentes

En HoloWeb, puede utilizar la siguiente instrucción para habilitar Binlog en una tabla existente y establecer su TTL. table_name es el nombre de la tabla para la que desea habilitar 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;

Parámetros WITH

VVR 11 cambió el nombre o eliminó algunas opciones del conector de Hologres, pero mantiene la compatibilidad con versiones anteriores respecto a VVR 8. Consulte la documentación de parámetros correspondiente a su versión.

Mapeo de tipos

Para conocer el mapeo de tipos de datos entre Flink y Hologres, consulte Data type mapping between Flink and Hologres.

Nota

Hologres admite la sintaxis GENERATED ALWAYS AS para definir una columna generada. Por ejemplo:

ds TIMESTAMP NOT NULL GENERATED ALWAYS AS (date_trunc('month', create_time)) STORED

La restricción NOT NULL de una columna generada se mapea a un campo que acepta valores nulos, tal como se espera. Dado que Hologres calcula el valor de una columna generada, Flink no escribe ningún valor para este campo. Si se conservara la restricción NOT NULL, la operación de escritura no superaría la validación en el cliente de Hologres. Este comportamiento no afecta la restricción NOT NULL de una columna normal (por ejemplo, ds TIMESTAMP NOT NULL).

Ejemplos

Ejemplos de tablas de origen

Tabla de origen de binlog

Modo CDC

En este modo, el origen consume datos de binlog y establece automáticamente el tipo RowKind de Flink adecuado para cada fila según hg_binlog_event_type, lo que elimina la necesidad de declararlo explícitamente. Estos tipos incluyen INSERT, DELETE, UPDATE_BEFORE y UPDATE_AFTER. Esto permite duplicar los datos de la tabla, de manera similar a la funcionalidad Change Data Capture (CDC) de bases de datos como MySQL o PostgreSQL. A continuación se muestra un ejemplo de DDL para la tabla de origen.

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

Modo no CDC

En este modo, el origen pasa los datos de binlog consumidos a los nodos descendentes como datos normales de Flink, y trata todos los registros como del tipo INSERT. Puede gestionar los registros con un hg_binlog_event_type específico según sus necesidades de negocio. A continuación se muestra un ejemplo de DDL para la tabla de origen.

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

Tabla de origen sin binlog

VVR 11+

Importante

A partir de VVR 11.1, el conector consume datos de binlog de forma predeterminada. Para leer desde una tabla de origen sin binlog, debe establecer explícitamente 'source.binlog' en 'false'. Para obtener más información, consulte Binlog source table.

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

Tabla de destino

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;

Ejemplo de tabla de dimensiones

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;

Funciones avanzadas

Ingesta unificada completa e incremental

Escenarios

  • Esta función se aplica únicamente a tablas de origen que tienen una clave primaria. Se recomienda para tablas de origen de Hologres que utilizan el modo CDC.

  • Hologres permite habilitar Binlog bajo demanda. Puede enable Binlog para tablas existentes que ya contienen datos.

Ejemplo de código

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.
  );
Nota
  • Establezca source.binlog.startup-mode en INITIAL para realizar una lectura inicial completa de la tabla antes de cambiar al consumo incremental del binlog.

  • Si se establece el parámetro startTime, ya sea directamente o al seleccionar una hora de inicio en la interfaz de arranque, este tiene prioridad. En ese caso, se establece binlogStartUpMode en el modo timestamp y se anulan otras configuraciones de modo, dado que el parámetro startTime tiene mayor prioridad.

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.
  );
Nota
  • Establezca binlogStartUpMode en initial para realizar una lectura inicial completa de la tabla antes de cambiar al consumo incremental del binlog.

  • Si se establece el parámetro startTime, ya sea directamente o al seleccionar una hora de inicio en la interfaz de arranque, este tiene prioridad. En ese caso, se establece binlogStartUpMode en el modo timestamp y se anulan otras configuraciones de modo, dado que el parámetro startTime tiene mayor prioridad.

Resolución de conflictos de clave primaria

El conector ofrece tres estrategias para manejar las claves primarias duplicadas durante la escritura.

VVR 11+

Especifique una estrategia al establecer el parámetro sink.on-conflict-action.

Valor

Descripción

INSERT_OR_IGNORE

Conserva el primer registro que llega e ignora los duplicados posteriores.

INSERT_OR_REPLACE

Sobrescribe el registro existente con el nuevo.

INSERT_OR_UPDATE (predeterminado)

Actualiza únicamente las columnas proporcionadas en la tabla sink y deja sin cambios las demás columnas del registro existente.

VVR 8+

Especifique una estrategia al establecer el parámetro mutatetype.

Valor

Descripción

insertorignore (predeterminado)

Conserva el primer registro que llega e ignora los duplicados posteriores.

insertorreplace

Sobrescribe el registro existente con el nuevo.

insertorupdate

Actualiza únicamente las columnas proporcionadas en la tabla sink y deja sin cambios las demás columnas del registro existente.

Por ejemplo, suponga que una tabla tiene las columnas a, b, c y d, donde a es la clave primaria. Si la tabla sink solo proporciona las columnas a y b, establecer la estrategia en INSERT_OR_UPDATE actualiza únicamente la columna b. Las columnas c y d permanecen sin cambios.
Nota

Sin embargo, cualquier columna de la tabla física que se omita en la tabla sink debe admitir valores nulos. De lo contrario, la operación de escritura fallará.

Escritura en tablas particionadas

De forma predeterminada, el sink de Hologres escribe los datos en una única tabla no particionada. Para escribir en una tabla particionada mediante su tabla principal, habilite las siguientes opciones.

VVR 11+

Para permitir que el conector cree automáticamente una partición secundaria cuando no existe, establezca sink.create-missing-partition en true.

Nota
  • VVR 11.1 y versiones posteriores admiten de forma predeterminada la escritura en tablas particionadas y enrutan automáticamente los datos a las particiones secundarias correctas.

  • Establezca el parámetro tablename con el nombre de la tabla principal.

  • Si no existe una partición secundaria obligatoria y no se establece sink.create-missing-partition=true, la operación de escritura fallará.

VVR 8+

  • Para enrutar automáticamente los datos a las particiones secundarias correspondientes, establezca partitionRouter en true.

  • Para permitir que el conector cree automáticamente una partición secundaria cuando no existe, establezca createparttable en true.

Nota
  • Establezca el parámetro tablename con el nombre de la tabla principal.

  • Si no existe una partición secundaria obligatoria y no se establece createparttable=true, la operación de escritura fallará.

Fusión de flujos y actualizaciones parciales

Cuando se escriben varios flujos en una sola tabla ancha de Hologres, el conector fusiona los registros que comparten la misma clave primaria. Las actualizaciones parciales escriben únicamente las columnas modificadas en lugar de reemplazar toda la fila, lo que mejora el rendimiento de escritura y la consistencia de los datos.

Limitaciones

  • La tabla ancha debe tener una clave primaria.

  • Cada flujo de datos debe incluir todas las columnas que conforman la clave primaria.

  • En las tablas anchas que usan almacenamiento orientado a columnas, fusionar flujos con una tasa alta de solicitudes por segundo (RPS) puede provocar un consumo elevado de CPU. Para mitigarlo, considere deshabilitar la codificación de diccionario en las columnas de la tabla.

Ejemplo

Suponga que cuenta con dos flujos de datos de Flink. El primer flujo contiene las columnas a, b y c. El segundo flujo contiene las columnas a, d y e. La tabla ancha de Hologres, WIDE_TABLE, contiene las columnas a, b, c, d y e, donde la columna a es la clave primaria.

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

Establezca ignoredelete en true para ignorar las solicitudes Delete generadas por mensajes de retracción. En VVR 8.0.8 y versiones posteriores, se recomienda usar sink.delete-strategy para configurar diversas estrategias de actualización parcial.

Consumo de binlog desde tablas particionadas (Beta)

El conector de Hologres admite el consumo de binlog desde tablas particionadas físicas y lógicas. Para conocer las diferencias entre ambas, consulte CREATE LOGICAL PARTITION TABLE.

Consumo de binlog desde tablas particionadas físicas

El conector de Hologres consume el binlog de una tabla particionada y supervisa dinámicamente las nuevas particiones dentro de un mismo trabajo. Esto mejora significativamente la eficiencia y la usabilidad del procesamiento de datos en tiempo real.

Notas de uso

  • Esta función solo está disponible para tablas de origen de binlog en modo JDBC. Requiere VVR 8.0.11 o posterior y una instancia de Hologres versión 2.1.27 o posterior.

  • El nombre de la partición debe seguir la convención de nomenclatura dynamic partitioning: {parent_table}_{partition_value}. Es posible que las particiones que no cumplan esta convención no se consuman.

    Importante
    • En el modo DYNAMIC, la versión 8.0.11 de VVR no admite columnas de partición con el delimitador - (por ejemplo, YYYY-MM-DD).

    • A partir de VVR 11.1, es posible consumir datos de columnas de partición que usan un formato personalizado.

    • Esta restricción no aplica cuando se escribe en tablas particionadas.

  • Al declarar una tabla de origen de Hologres en Flink, debe incluir sus columnas de partición.

  • En el modo DYNAMIC, la tabla particionada debe tener habilitado dynamic partitioning. Además, el parámetro de precreación de particiones auto_partitioning.num_precreate debe ser mayor que 1. De lo contrario, el trabajo generará una excepción al intentar consumir la partición más reciente.

  • En el modo DYNAMIC, después de agregar una nueva partición, el conector deja de consumir los cambios de datos posteriores de las particiones anteriores.

Ejemplos

Modo

Funciones

Descripción

DYNAMIC

consumo dinámico de particiones

Supervisa y consume automáticamente las nuevas particiones en orden cronológico. Este modo es adecuado para escenarios de streaming de datos en tiempo real.

STATIC

consumo estático de particiones

Consume únicamente las particiones existentes (o las especificadas manualmente) y no descubre nuevas particiones de forma automática. Resulta útil para procesar datos históricos dentro de un rango fijo.

Dynamic mode

VVR 11+

Suponga que se crea una tabla particionada de Hologres con el siguiente DDL y que el binlog y el particionamiento dinámico están habilitados.

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.

En Flink, use la siguiente instrucción SQL para consumir la tabla particionada test_message_src1 en modo 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

Suponga que se crea una tabla particionada de Hologres con el siguiente DDL y que el binlog y el particionamiento dinámico están habilitados.

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.

En Flink, use la siguiente instrucción SQL para consumir datos de la tabla particionada test_message_src1 en modo 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+

Suponga que se crea una tabla particionada de Hologres con el siguiente DDL y que el binlog está habilitado.

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

En Flink, use la siguiente instrucción SQL para consumir la tabla particionada test_message_src2 en modo 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

Suponga que se crea una tabla particionada de Hologres con el siguiente DDL y que el binlog está habilitado.

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

En Flink, use la siguiente instrucción SQL para consumir datos de la tabla particionada test_message_src2 en modo 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.
);

Consumo de binlog desde tablas particionadas lógicas

El conector de Hologres admite el consumo de binlog desde tablas particionadas lógicas y permite especificar qué particiones consumir mediante opciones.

Notas de uso

  • El consumo de binlog desde particiones específicas de una tabla particionada lógica requiere VVR 11.0.0 o posterior y una instancia de Hologres versión V3.1 o posterior.

  • El consumo de binlog desde todas las particiones de una tabla particionada lógica sigue el mismo enfoque que una tabla no particionada (Source tables).

Ejemplos

Parámetro

Descripción

Ejemplo

source.binlog.logical-partition-filter-column-names

Los nombres de las columnas de partición que indican qué particiones consumir. Encierre los nombres de columna entre comillas dobles ("). Separe varios nombres de columna con comas (,). Si un nombre de columna contiene comillas dobles, escápelas con otras comillas dobles adicionales.

'source.binlog.logical-partition-filter-column-names'='"Pt","id"'

Se utilizan dos columnas de partición: Pt e id.

source.binlog.logical-partition-filter-column-values

Los valores de partición que indican qué particiones consumir. Una partición se especifica mediante un conjunto de valores, uno por cada columna de partición. Encierre cada valor entre comillas dobles ("). Separe los valores de la misma partición con una coma (,) y las particiones con un punto y coma (;). Si un valor contiene comillas dobles, escápelas con otras comillas dobles adicionales.

'source.binlog.logical-partition-filter-column-values'='"20240910","0";"special""value","9"'

Esto especifica dos particiones para consumir. El valor de la primera partición es (20240910, 0) y el de la segunda es (special"value, 9).

Suponga que creó la siguiente tabla en 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'
);

Para consumir el binlog de esta tabla en 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.
);

API de DataStream

Importante

Para leer o escribir en Hologres mediante la API de DataStream, configure el conector de DataStream correspondiente (How to use DataStream connectors). El conector de DataStream de Hologres está disponible en Maven Central. Para la depuración local, utilice el Uber JAR (Run and debug jobs that contain connectors locally).

Tabla de origen de Hologres

Binlog source table

VVR proporciona la clase HologresBinlogSource para leer datos de binlog de Hologres. A continuación se muestra cómo construir un origen de binlog de Hologres.

VVR 11.3+

Importante

A partir de VVR 11.1.2, se eliminaron los parámetros JDBCOptions y startTimeMs del constructor de HologresBinlogSource. Desde VVR 11.3, se agregó un parámetro List<Subscribe.BinlogFilter>. Si utiliza VVR 11 o posterior, se recomienda emplear VVR 11.3 o una versión más reciente.

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

Si utiliza una versión del motor de Flink anterior a la 8.0.5 o una versión de Hologres anterior a la 2.1, asegúrese de que el usuario sea superusuario o tenga el Replication Role (Hologres permission issues).

Non-binlog source table

VVR proporciona la clase HologresBulkreadInputFormat, una implementación de RichInputFormat, para leer datos de tablas de Hologres. A continuación se muestra cómo construir un origen de 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

El conector de DataStream de Hologres está disponible en Maven Central.

<dependency>
    <groupId>com.alibaba.ververica</groupId>
    <artifactId>ververica-connector-hologres</artifactId>
    <version>${vvr-version}</version>
</dependency>

Tabla sink de 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();
    }
}

Columnas de metadatos

VVR 8.0.11 y versiones posteriores admiten columnas de metadatos en las tablas de origen de binlog. Declare los campos de binlog, como hg_binlog_event_type, como columnas de metadatos para acceder al nombre de la base de datos de origen, el nombre de la tabla, el tipo de cambio y la marca de tiempo del evento. Esto le permite aplicar lógica personalizada (por ejemplo, filtrar eventos DELETE).

Parámetro

Tipo

Descripción

db_name

STRING NOT NULL

Nombre de la base de datos que contiene la fila.

table_name

STRING NOT NULL

Nombre de la tabla que contiene la fila.

hg_binlog_lsn

BIGINT NOT NULL

Campo del sistema para el número de secuencia del binlog. El valor aumenta de forma monótona, pero no contigua, dentro de un shard. No se garantiza la unicidad ni el orden entre distintos shards.

hg_binlog_timestamp_us

BIGINT NOT NULL

Marca de tiempo del evento de cambio en la base de datos, expresada en microsegundos (us).

hg_binlog_event_type

BIGINT NOT NULL

Tipo de cambio de la fila. Valores válidos:

  • 5: mensaje INSERT.

  • 2: mensaje DELETE.

  • 3: imagen de la fila antes de una operación UPDATE.

  • 7: imagen de la fila después de una operación UPDATE.

hg_shard_id

INT NOT NULL

ID del shard de datos que contiene la fila (table group and shard).

En una instrucción DDL, puede declarar una columna de metadatos con la sintaxis <meta_column_name> <datatype> METADATA VIRTUAL. A continuación se muestra un ejemplo:

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

Preguntas frecuentes

Referencias