Todos los productos
Search
Centro de documentos

Realtime Compute for Apache Flink:Lindorm connector

Última actualización: Sep 03, 2026

Sink: Streaming Lookup source: Sync/Async mode

El conector de Lindorm permite que los trabajos de streaming de Flink escriban datos en tablas anchas de Lindorm y realicen búsquedas en ellas mediante la API de SQL.

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

  • Un motor de tablas anchas de Lindorm y una tabla de Lindorm. Para obtener más información, consulte Create an instance.

  • Conectividad de red entre el clúster de Lindorm y el espacio de trabajo de Flink; por ejemplo, que ambos se encuentren en la misma virtual private cloud (VPC).

Las tablas Lindorm HBase no son compatibles. Solo se admite LindormTable.

Inicio rápido

El siguiente ejemplo genera 10 filas de datos, busca las filas coincidentes en una tabla de dimensiones de Lindorm y escribe el resultado en una tabla sink de Lindorm.

-- Source: generate 10 rows with sequential IDs 0-9
CREATE TEMPORARY TABLE example_source (
  id INT,
  proc_time AS PROCTIME()
) WITH (
  'connector' = 'datagen',
  'number-of-rows' = '10',
  'fields.id.kind' = 'sequence',
  'fields.id.start' = '0',
  'fields.id.end' = '9'
);

-- Dimension table: look up user details from Lindorm
CREATE TEMPORARY TABLE lindorm_hbase_dim (
  `id`    INT,
  `name`  VARCHAR,
  `birth` VARCHAR,
  PRIMARY KEY (id) NOT ENFORCED
) WITH (
  'connector'   = 'lindorm',
  'tablename'   = '${lindorm_dim_table}',
  'seedserver'  = '${lindorm_seed_server}',
  'namespace'   = 'default',
  'username'    = '${lindorm_username}',
  'password'    = '${lindorm_password}'
);

-- Sink table: write enriched records to Lindorm
CREATE TEMPORARY TABLE lindorm_hbase_sink (
  `id`    INT,
  `name`  VARCHAR,
  `birth` VARCHAR,
  PRIMARY KEY (id) NOT ENFORCED
) WITH (
  'connector'   = 'lindorm',
  'tablename'   = '${lindorm_sink_table}',
  'seedserver'  = '${lindorm_seed_server}',
  'namespace'   = 'default',
  'username'    = '${lindorm_username}',
  'password'    = '${lindorm_password}'
);

-- Temporal join: enrich source data with the dimension table and write to sink
INSERT INTO lindorm_hbase_sink
SELECT
  s.id,
  d.name,
  d.birth
FROM example_source AS s
JOIN lindorm_hbase_dim AS d FOR SYSTEM_TIME AS OF s.proc_time
  ON s.id = d.id;

Reemplace los marcadores de posición antes de ejecutar:

Marcador de posición

Descripción

${lindorm_dim_table}

Nombre de la tabla de dimensiones de Lindorm

${lindorm_sink_table}

Nombre de la tabla sink de Lindorm

${lindorm_seed_server}

Endpoint del servidor de Lindorm en formato host:port

${lindorm_username}

Nombre de usuario de Lindorm

${lindorm_password}

Contraseña de Lindorm

Sintaxis

CREATE TABLE white_list (
  id     VARCHAR,
  name   VARCHAR,
  age    INT,
  PRIMARY KEY (id) NOT ENFORCED
) WITH (
  'connector'    = 'lindorm',
  'seedserver'   = '<host:port>',
  'namespace'    = '<yourNamespace>',
  'username'     = '<yourUsername>',
  'password'     = '<yourPassword>',
  'tableName'    = '<yourTableName>',
  'columnFamily' = '<yourColumnFamily>'
);

Opciones del conector

Generales

Opción

Tipo

Obligatorio

Predeterminado

Descripción

connector

String

Sí

—

Debe ser lindorm.

seedserver

String

Sí

—

Endpoint del servidor de Lindorm en formato host:port. Realtime Compute for Apache Flink utiliza la API de ApsaraDB for HBase para Java para establecer la conexión. Para más detalles, consulte Use Flink to connect to and use LindormTable.

namespace

String

Sí

—

Namespace de la base de datos de Lindorm.

username

String

Sí

—

Nombre de usuario de la base de datos de Lindorm.

password

String

Sí

—

Contraseña de la base de datos de Lindorm.

tableName

String

Sí

—

Nombre de la tabla de Lindorm.

columnFamily

String

Sí

—

Nombre de la familia de columnas. Si no se especificó ninguna familia de columnas al crear la tabla, introduzca f.

retryIntervalMs

Integer

No

1000

Intervalo de reintento para operaciones de lectura con errores, en milisegundos.

maxRetryTimes

Integer

No

5

Número máximo de reintentos para operaciones de lectura o escritura.

Específicas de sink

Opción

Tipo

Obligatorio

Predeterminado

Descripción

bufferSize

Integer

No

500

Número de registros que se almacenan en búfer antes de enviarlos a Lindorm.

flushIntervalMs

Integer

No

2000

Tiempo máximo entre envíos cuando el búfer no está lleno, en milisegundos.

ignoreDelete

Boolean

No

false

Cuando es true, se omiten las operaciones de eliminación.

dynamicColumnSink

Boolean

No

false

Cuando es true, habilita la función de tabla dinámica. Consulte Dynamic table.

excludeUpdateColumns

String

No

—

Lista separada por comas de columnas que se excluirán de las actualizaciones. Por ejemplo, a,b,c omite las actualizaciones en las columnas a, b y c. Requiere VVR 8.0.9 o posterior.

Específicas de tabla de dimensiones

Opción

Tipo

Obligatorio

Predeterminado

Descripción

partitionedJoin

Boolean

No

false

Cuando es true, utiliza JoinKey para el particionamiento y mejorar la tasa de aciertos de caché.

shuffleEmptyKey

Boolean

No

false

Cuando es true, enruta aleatoriamente las claves vacías del flujo ascendente a los nodos del flujo descendente. Cuando es false, las enruta al hilo paralelo 0.

cache

String

No

None

Directiva de caché. Valores válidos: None (sin caché) y LRU (almacena en caché las filas accedidas recientemente).

cacheSize

Integer

No

1000

Número máximo de filas que se almacenan en caché. Aplica cuando cache es LRU.

cacheTTLMs

Integer

No

—

Tiempo de expiración de las entradas de caché, en milisegundos. Aplica cuando cache es LRU. De forma predeterminada, las entradas no expiran.

cacheEmpty

Boolean

No

true

Cuando es true, almacena en caché los resultados de búsqueda que no devolvieron filas.

async

Boolean

No

false

Cuando es true, habilita el modo de búsqueda asíncrona.

asyncLindormRpcTimeoutMs

Integer

No

300000

Tiempo de espera de RPC para búsquedas asíncronas, en milisegundos.

Caché de búsqueda

De forma predeterminada, el conector obtiene cada búsqueda directamente de Lindorm (cache = None). Habilite la caché LRU para reducir la presión de lectura en Lindorm durante uniones de alto throughput.

Con cache = LRU, el conector almacena en memoria las filas accedidas recientemente. Cuando la clave de unión coincide con una fila en caché, el conector devuelve el valor almacenado sin consultar a Lindorm. Una entrada en caché se desaloja cuando:

  • La caché alcanza cacheSize filas (las filas más antiguas se desalojan primero).

  • La entrada ha permanecido en la caché durante más de cacheTTLMs milisegundos.

Existe un compromiso: un TTL más largo o una caché más grande reduce el tráfico de lectura hacia Lindorm, pero aumenta el riesgo de servir datos obsoletos. Ajuste ambos valores según sus requisitos de throughput y la frecuencia con la que cambian los datos subyacentes.

El conector de Lindorm admite uniones de búsqueda de uno a muchos. Preste especial atención a las estrategias de caché y al throughput cuando las filas de la tabla de dimensiones puedan coincidir con varios eventos del flujo ascendente.

Escrituras idempotentes

Cuando una tabla de Lindorm tiene una clave primaria, todas las escrituras utilizan semántica upsert: cada registro entrante inserta una nueva fila o actualiza la fila existente coincidente. Esto hace que las escrituras sean idempotentes.

Las escrituras idempotentes son importantes para la tolerancia a fallos. Si un trabajo de Flink se reinicia desde un checkpoint, reproduce los mensajes desde el último checkpoint exitoso. Dado que los upserts de Lindorm son idempotentes, los registros reproducidos generan el mismo resultado que las escrituras originales, sin filas duplicadas ni violaciones de restricciones.

Defina una clave primaria en su DDL para aprovechar las escrituras idempotentes.

Tabla dinámica

Utilice la función de tabla dinámica cuando su esquema evolucione en tiempo de ejecución; es decir, cuando las columnas se creen dinámicamente según los valores de los datos en lugar de definirse de forma fija en el DDL. Un caso de uso típico es el seguimiento de métricas horarias por día, donde las horas son nombres de columna y los días son claves primarias:

Clave primaria

00:00

01:00

2025-06-01

45

32

2025-06-02

76

34

Reglas de DDL para tablas dinámicas:

  • Las primeras N columnas forman la clave primaria.

  • Las últimas dos columnas deben ser VARCHAR.

  • La penúltima columna (c1) contiene el nombre de la columna dinámica.

  • La última columna (c2) contiene el valor de dicha columna.

  • No se permiten columnas fuera de la clave primaria distintas de c1 y c2.

CREATE TABLE lindorm_dynamic_output (
  pk1 VARCHAR,
  pk2 VARCHAR,
  pk3 VARCHAR,
  c1  VARCHAR,  -- column name written to Lindorm
  c2  VARCHAR,  -- column value written to Lindorm
  PRIMARY KEY (pk1, pk2, pk3) NOT ENFORCED
) WITH (
  'connector'         = 'lindorm',
  'seedserver'        = '<host:port>',
  'namespace'         = '<yourNamespace>',
  'username'          = '<yourUsername>',
  'password'          = '<yourPassword>',
  'tableName'         = '<yourTableName>',
  'columnFamily'      = '<yourColumnFamily>',
  'dynamicColumnSink' = 'true'
);

Cada vez que se escribe un registro, el conector agrega o actualiza una columna en la fila de Lindorm identificada por <pk1, pk2, pk3>. Las demás columnas de esa fila permanecen sin cambios.

Mapeo de tipos de datos

Todos los datos de Lindorm se almacenan en formato binario. La siguiente tabla muestra cómo convierte el conector entre los tipos de Flink SQL y las representaciones binarias de Lindorm.

Tipo de Flink SQL

Escritura en Lindorm

Lectura desde Lindorm

CHAR / VARCHAR

StringData::toBytes

StringData::fromBytes

BOOLEAN

Bytes::toBytes(boolean)

Bytes::toBigDecimal

BINARY / VARBINARY

Bytes directos

Bytes directos

DECIMAL

Bytes::toBytes(BigDecimal)

Bytes::toBigDecimal

TINYINT

Primer byte de byte[]

bytes[0]

SMALLINT

Bytes::toBytes(short)

Bytes::toShort

INT

Bytes::toBytes(int)

Bytes::toInt

BIGINT

Bytes::toBytes(long)

Bytes::toLong

FLOAT

Bytes::toBytes(float)

Bytes::toFloat

DOUBLE

Bytes::toBytes(double)

Bytes::toDouble

DATE

Bytes::toBytes(int) con días desde 1970-01-01

Bytes::toInt → días desde 1970-01-01

TIME

Bytes::toBytes(int) con milisegundos desde 00:00:00

Bytes::toInt → milisegundos desde 00:00:00

TIMESTAMP

Bytes::toBytes(long) con milisegundos desde 1970-01-01 00:00:00

Bytes::toLong → milisegundos desde 1970-01-01 00:00:00

Los métodos de Bytes se encuentran en la clase com.alibaba.lindorm.client.core.utils.Bytes. Los métodos de StringData (filas CHAR/VARCHAR) se encuentran en la clase org.apache.flink.table.data.StringData.

Métricas

A continuación se presentan las métricas de sink disponibles. Para más detalles, consulte Metrics.

Métrica

Descripción

numBytesOut

Total de bytes escritos en el sink

numBytesOutPerSecond

Bytes escritos por segundo

numRecordsOut

Total de registros escritos en el sink

numRecordsOutPerSecond

Registros escritos por segundo

Preguntas frecuentes

Lindorm connection errors and solutions