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 |
|
|
Tipos de API |
DataStream y SQL |
|
Admite actualizaciones o eliminaciones de datos en tablas de destino |
Sí |
Funciones
|
Función |
Descripción |
|
Permite leer datos de Hologres con o sin binlog, tanto en modo CDC como fuera de este. |
|
|
Admite el consumo completo, incremental y unificado (completo e incremental). |
|
|
Permite ignorar datos nuevos, reemplazar filas completas o actualizar únicamente campos específicos. |
|
|
Actualiza solo las columnas modificadas en lugar de la fila completa. |
|
|
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. |
|
|
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:
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 tipoTIMESTAMPTZ****.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_STREAMoCOPY_BULK_LOAD, los valores de las columnas de la tabla que usanCURRENT_TIMESTAMPoNOW()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 binloghg_binlog_timestamp_usproporciona 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.
ImportanteSi 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
holohubestá obsoleto en Hologres 2.0 y versiones posteriores. El sistema cambia automáticamente al modojdbc, 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
jdbccon conexiones ligeras habilitadas de forma predeterminada (el parámetroconnection.fixed.enabledse establece entrue). -
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.
ImportanteEn 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.
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 modojdbc_fixedy 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 modojdbc_fixedy establece 'deduplication.enabled'='false' para evitar la deduplicación.ImportanteEl servicio
rpcestá obsoleto en Hologres 2.0 y versiones posteriores. Si establece este parámetro enrpc, Flink cambia automáticamente el valor ajdbc_fixed. Si le asigna un valor distinto, Flink utiliza el valor especificado.El modo
rpcse eliminó en VVR 11.1 y versiones posteriores. Se recomienda utilizar el modojdbcpara las conexiones.Para operaciones de escritura en escenarios de alta concurrencia, se recomienda usar el modo
jdbc_copyoCOPY_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
rpcestá obsoleto en instancias de Hologres de la versión 2.0 o posterior. Si establece este parámetro enrpc, Flink cambia automáticamente el valor ajdbc_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
ImportanteEl modo
rpcse eliminó en VVR 11.1 y versiones posteriores. De forma predeterminada, se utiliza el modojdbcpara las conexiones. También puede habilitar el modo de conexión ligera mediante el parámetroconnection.fixed.enabled. -
Para leer datos de
JSONBdesde 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
UPDATEgenera dos registros de binlog consecutivos: el registroupdate_beforepara los datos antiguos, seguido del registroupdate_afterpara los datos nuevos.Evite ejecutar
TRUNCATEu 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
DECIMALsea consistente entre Flink y Hologres para evitar errores. Para obtener más información, consulte FAQ.Cuando utiliza el modo
initialpara 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.
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+
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.
);
Establezca
source.binlog.startup-modeenINITIALpara 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 establecebinlogStartUpModeen el modotimestampy se anulan otras configuraciones de modo, dado que el parámetrostartTimetiene 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.
);
Establezca
binlogStartUpModeeninitialpara 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 establecebinlogStartUpModeen el modotimestampy se anulan otras configuraciones de modo, dado que el parámetrostartTimetiene 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.
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.
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
tablenamecon 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
partitionRouterentrue.Para permitir que el conector cree automáticamente una partición secundaria cuando no existe, establezca
createparttableentrue.
Establezca el parámetro
tablenamecon 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;
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.ImportanteEn 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_precreatedebe 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
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+
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();
}
}
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:
|
|
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
Para aprender a crear y usar catálogos de Hologres, consulte Manage Hologres catalogs.
Hologres se integra con Flink para ofrecer una solución unificada que permite construir un almacén de datos en tiempo real. Para obtener más información, consulte Build a Hologres real-time data warehouse.
Hologres admite actualizaciones y correcciones de datos eficientes, por lo que resulta adecuado para construir tablas anchas en escenarios de escritura de múltiples flujos. Consulte User behavior analysis with Flink, MongoDB, and Hologres para ver un ejemplo.