El conector de Tablestore permite utilizar tablas de Tablestore como tablas de origen, tablas de dimensión y tablas de destino en trabajos de Flink SQL que se ejecutan en modo streaming.
Capacidades del conector
|
Elemento |
Descripción |
|
Modo de ejecución |
Modo streaming |
|
Tipo de API |
API SQL |
|
Tipo de tabla |
Tabla de origen, tabla de dimensión y tabla de destino |
|
Formato de datos |
N/D |
|
Métricas de la tabla de destino |
|
|
Actualización o eliminación de datos en una tabla de destino |
Compatible |
Para obtener más información sobre las métricas de destino, consulte Métricas de monitoreo .
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de Tablestore y una tabla de Tablestore. Consulte Use Tablestore.
Límites de uso
Se admite el acceso entre cuentas a instancias de Tablestore. Al utilizar un endpoint de VPC, la instancia de Tablestore debe encontrarse en la misma región que Flink. Establezca los valores de accessId y accessKey con el par de AccessKey de la cuenta propietaria de la instancia de Tablestore.
Sintaxis
Los tres tipos de tabla utilizan 'connector'='ots' en la cláusula WITH, junto con opciones específicas según el tipo.
Tabla de destino
CREATE TABLE ots_sink (
name VARCHAR,
age BIGINT,
birthday BIGINT,
PRIMARY KEY (name, age) NOT ENFORCED
) WITH (
'connector'='ots',
'instanceName'='<yourInstanceName>',
'tableName'='<yourTableName>',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'endPoint'='<yourEndpoint>',
'valueColumns'='birthday'
);
Una tabla de destino de Tablestore requiere una clave primaria. Cada registro de salida se agrega a la tabla para actualizar los datos existentes.
Tabla de dimensión
CREATE TABLE ots_dim (
id INT,
len INT,
content STRING
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='<yourInstanceName>',
'tableName'='<yourTableName>',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}'
);
Tabla de origen
CREATE TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-source',
'tableName'='flink_source_table',
'tunnelName'='flinksourcestream',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='false'
);
Metadatos disponibles
La tabla de origen de Tablestore expone dos campos de metadatos mediante la palabra clave METADATA. Utilice estos campos para rastrear el tipo de operación y el momento de cada evento de cambio.
|
Clave de metadatos |
Tipo de dato en Flink |
Descripción |
|
|
STRING |
El tipo de operación de datos (se asigna a |
|
|
BIGINT |
La hora de la operación de datos en microsegundos (se asigna a |
Para leer campos de metadatos, declárelos con la sintaxis METADATA FROM:
CREATE TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR,
record_type STRING METADATA FROM 'type',
record_timestamp BIGINT METADATA FROM 'timestamp'
) WITH (
...
);
Opciones del conector
Opciones generales
Todos los tipos de tabla comparten las siguientes opciones.
|
Opción |
Tipo |
Obligatorio |
Valor predeterminado |
Descripción |
|
|
String |
Sí |
— |
Establezca este valor en |
|
|
String |
Sí |
— |
Nombre de la instancia de Tablestore. |
|
|
String |
Sí |
— |
Endpoint de la instancia de Tablestore. Consulte Endpoints. |
|
|
String |
Sí |
— |
Nombre de la tabla. |
|
|
String |
Sí |
— |
AccessKey ID de su cuenta de Alibaba Cloud o de un usuario de Resource Access Management (RAM). Consulte How do I view the AccessKey ID and AccessKey secret? |
|
|
String |
Sí |
— |
AccessKey secret de su cuenta de Alibaba Cloud o de un usuario de RAM. |
|
|
Integer |
No |
30000 |
Tiempo de espera de conexión en milisegundos. |
|
|
Integer |
No |
30000 |
Tiempo de espera del socket en milisegundos. |
|
|
Integer |
No |
4 |
Número de hilos de E/S. |
|
|
Integer |
No |
4 |
Tamaño del pool de hilos de callback. |
Utilice variables para almacenar su par de AccessKey en lugar de escribirlo directamente en el código.
Opciones de la tabla de origen
|
Opción |
Tipo |
Obligatorio |
Valor predeterminado |
Descripción |
|
|
String |
Sí |
— |
Nombre del túnel de Tablestore. Cree el túnel en la consola de Tablestore antes de usar esta opción. Tipos de túnel compatibles: Incremental, Full y Differential. Consulte la sección "Create a tunnel" en Quick start. |
|
|
Boolean |
No |
false |
Indica si se deben omitir las operaciones de eliminación. |
|
|
Boolean |
No |
false |
Indica si se deben omitir los datos no válidos. |
|
|
Enum |
No |
TIME |
Directiva de reintentos. |
|
|
Integer |
No |
3 |
Número máximo de reintentos. Aplica cuando |
|
|
Integer |
No |
180000 |
Tiempo de espera de reintento en milisegundos. Aplica cuando |
|
|
String |
No |
— |
Asignación de nombres de columna originales a nombres de columna reales. Formato: |
|
|
Boolean |
No |
false |
Indica si se debe transferir el tipo de fila específico. |
|
|
Integer |
No |
10000 |
Tiempo máximo en milisegundos para obtener datos de una sola partición. Reduzca este valor para disminuir la latencia general de sincronización al sincronizar muchas particiones. Requiere VVR 8.0.10 o posterior. |
|
|
Boolean |
No |
false |
Indica si se debe habilitar la compresión de solicitudes. Reduce el uso de ancho de banda a costa de una mayor carga de CPU. Requiere VVR 8.0.10 o posterior. |
Opciones de la tabla de destino
|
Opción |
Tipo |
Obligatorio |
Valor predeterminado |
Descripción |
|
|
String |
Sí |
— |
Nombres de las columnas que se van a escribir. Separe varios nombres de columna con comas (,). |
|
|
Integer |
No |
1000 |
Intervalo de reintento en milisegundos. |
|
|
Integer |
No |
10 |
Número máximo de reintentos. |
|
|
Integer |
No |
5000 |
Número máximo de registros almacenados en búfer antes de desencadenar una escritura. |
|
|
Integer |
No |
5000 |
Tiempo de espera de escritura en milisegundos. Si los registros en búfer no alcanzan |
|
|
Integer |
No |
100 |
Número de registros escritos por lote. Máximo: 200. |
|
|
Boolean |
No |
false |
Indica si se deben omitir las operaciones de eliminación. |
|
|
String |
No |
— |
Nombre de la columna de clave primaria de incremento automático. Configure esta opción solo si la tabla de destino tiene una columna de clave primaria de incremento automático. Requiere VVR 8.0.4 o posterior. |
|
|
Enum |
No |
PUT |
Modo de escritura. |
|
|
Long |
No |
-1 |
Marca de tiempo predeterminada para escrituras. Si no se establece, se utiliza la hora actual del sistema. |
|
|
Boolean |
No |
false |
Indica si se debe habilitar el modo de columna dinámica. En este modo no hay columnas predefinidas; las columnas se insertan según los valores en tiempo de ejecución. Las primeras N columnas definen la clave primaria. La penúltima columna contiene el nombre de la columna y la última contiene su valor; ambas deben ser de tipo STRING. Si se habilita, |
|
|
Boolean |
No |
true |
Indica si se debe comprobar que la clave primaria de la tabla de Tablestore coincide con la clave primaria declarada en la sentencia CREATE TABLE. |
|
|
Boolean |
No |
false |
Indica si se debe habilitar la compresión de solicitudes durante las escrituras. |
|
|
Integer |
No |
128 |
Número máximo de columnas escritas en la tabla de destino. Si se establece un valor superior a 128, se produce el error |
|
|
String |
No |
|
Tipo de tabla de destino. |
Opciones de la tabla de dimensión
Funcionamiento de la caché
La caché de la tabla de dimensión reduce las consultas repetidas a Tablestore. Elija una directiva de caché según el tamaño de su tabla y los patrones de consulta:
None: Sin caché. Cada consulta accede directamente a Tablestore. Utilice esta opción cuando los datos cambien con frecuencia y la actualización sea crítica.
LRU: Almacena en caché un número fijo de registros accedidos recientemente. Cuando una consulta falla en la caché, el conector consulta Tablestore y actualiza la caché con el resultado. Establezca
cacheSizeycacheTTLMsal usar esta directiva.ALL (predeterminado): Carga toda la tabla de dimensión en la caché antes de que comience el trabajo. Todas las consultas posteriores se resuelven desde la caché. Cuando la caché caduca (
cacheTTLMs), el conector vuelve a cargar todos los datos. Utilice ALL cuando la tabla sea pequeña y espere muchas consultas con claves inexistentes. Al usar ALL, aumente la memoria del nodo de unión, ya que la caché requiere aproximadamente el doble del tamaño de la tabla remota.
|
Opción |
Tipo |
Obligatorio |
Valor predeterminado |
Descripción |
|
|
Integer |
No |
1000 |
Intervalo de reintento en milisegundos. |
|
|
Integer |
No |
10 |
Número máximo de reintentos. |
|
|
String |
No |
ALL |
Directiva de caché: |
|
|
Integer |
No |
— |
Número máximo de registros en caché. Aplica cuando |
|
|
Integer |
No |
— |
TTL de la caché en milisegundos. Para LRU: tiempo de espera por entrada. Para ALL: intervalo de actualización completa de la caché. Déjelo sin configurar para deshabilitar la caducidad. |
|
|
Boolean |
No |
— |
Indica si se deben almacenar en caché los resultados vacíos (sin coincidencias). |
|
|
String |
No |
— |
Ventanas de tiempo durante las cuales no se actualiza la caché ALL. Formato: |
|
|
Boolean |
No |
false |
Indica si se debe habilitar la búsqueda asíncrona. |
Asignaciones de tipos de datos
Tabla de origen
|
Tipo de Tablestore |
Tipo de Flink SQL |
|
INTEGER |
BIGINT |
|
STRING |
STRING |
|
BOOLEAN |
BOOLEAN |
|
DOUBLE |
DOUBLE |
|
BINARY |
BINARY |
Tabla de destino
|
Tipo de Flink SQL |
Tipo de Tablestore |
|
BINARY |
BINARY |
|
VARBINARY |
BINARY |
|
CHAR |
STRING |
|
VARCHAR |
STRING |
|
TINYINT |
INTEGER |
|
SMALLINT |
INTEGER |
|
INTEGER |
INTEGER |
|
BIGINT |
INTEGER |
|
FLOAT |
DOUBLE |
|
DOUBLE |
DOUBLE |
|
BOOLEAN |
BOOLEAN |
Ejemplos
Leer desde Tablestore y escribir en Tablestore
Este ejemplo lee datos de pedidos desde una tabla de origen de Tablestore a través de Tunnel Service y los escribe en una tabla de destino de Tablestore. La tabla de destino utiliza una columna de clave primaria de incremento automático.
CREATE TEMPORARY TABLE tablestore_stream (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-source',
'tableName'='flink_source_table',
'tunnelName'='flinksourcestream',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='false',
'skipInvalidData'='false'
);
CREATE TEMPORARY TABLE ots_sink (
`order` VARCHAR,
orderid VARCHAR,
customerid VARCHAR,
customername VARCHAR,
PRIMARY KEY (`order`, orderid) NOT ENFORCED
) WITH (
'connector'='ots',
'endPoint'='<yourEndpoint>',
'instanceName'='flink-sink',
'tableName'='flink_sink_table',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'valueColumns'='customerid,customername',
'autoIncrementKey'='${auto_increment_primary_key_name}'
);
INSERT INTO ots_sink
SELECT `order`, orderid, customerid, customername FROM tablestore_stream;
Sincronizar una tabla de columnas anchas con una tabla de series temporales
Este ejemplo lee desde una tabla de origen de columnas anchas y escribe en una tabla de destino de series temporales. La columna tags de la tabla de destino utiliza MAP<STRING, STRING> para almacenar pares clave-valor de etiquetas, y storageType se establece en TIMESERIES.
CREATE TEMPORARY TABLE timeseries_source (
measurement STRING,
datasource STRING,
tag_a STRING,
`time` BIGINT,
binary_value BINARY,
bool_value BOOLEAN,
double_value DOUBLE,
long_value BIGINT,
string_value STRING,
tag_b STRING,
tag_c STRING,
tag_d STRING,
tag_e STRING,
tag_f STRING
) WITH (
'connector'='ots',
'endPoint'='https://iotstore-test.cn-hangzhou.vpc.tablestore.aliyuncs.com',
'instanceName'='iotstore-test',
'tableName'='test_ots_timeseries_2',
'tunnelName'='timeseries_source_tunnel_2',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'ignoreDelete'='true'
);
CREATE TEMPORARY TABLE timeseries_sink (
measurement STRING,
datasource STRING,
tags MAP<STRING, STRING>,
`time` BIGINT,
binary_value BINARY,
bool_value BOOLEAN,
double_value DOUBLE,
long_value BIGINT,
string_value STRING,
tag_b STRING,
tag_c STRING,
tag_d STRING,
tag_e STRING,
tag_f STRING,
PRIMARY KEY (measurement, datasource, tags, `time`) NOT ENFORCED
) WITH (
'connector'='ots',
'endPoint'='https://iotstore-test.cn-hangzhou.vpc.tablestore.aliyuncs.com',
'instanceName'='iotstore-test',
'tableName'='test_timeseries_sink_table_2',
'accessId'='${ak_id}',
'accessKey'='${ak_secret}',
'storageType'='TIMESERIES'
);
-- Build the tags map from individual tag columns and insert into the time series sink table
INSERT INTO timeseries_sink
SELECT
measurement,
datasource,
MAP['tag_a', tag_a, 'tag_b', tag_b, 'tag_c', tag_c, 'tag_d', tag_d, 'tag_e', tag_e, 'tag_f', tag_f] AS tags,
`time`,
binary_value,
bool_value,
double_value,
long_value,
string_value,
tag_b,
tag_c,
tag_d,
tag_e,
tag_f
FROM timeseries_source;