Le connecteur Tablestore permet d'utiliser des tables Tablestore comme tables source, tables de dimension et tables de destination dans les jobs Flink SQL exécutés en mode streaming.
Fonctionnalités du connecteur
| Élément | Description |
|---|---|
| Mode d'exécution | Mode streaming |
| Type d'API | API SQL |
| Type de table | Table source, table de dimension et table de destination |
| Format des données | N/A |
| Métriques de la table de destination | numBytesOut, numBytesOutPerSecond, numRecordsOut, numRecordsOutPerSecond, currentSendTime |
| Mise à jour ou suppression des données dans une table de destination | Pris en charge |
Pour plus d'informations sur les métriques de destination, consultez la rubrique Monitoring metrics .
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Tablestore et une table Tablestore. Consultez la rubrique Use Tablestore.
Limites d'utilisation
L'accès inter-comptes aux instances Tablestore est pris en charge. Lors de l'utilisation d'un endpoint VPC, l'instance Tablestore doit se trouver dans la même région que Flink. Définissez les paramètres accessId et accessKey avec la paire AccessKey du compte propriétaire de l'instance Tablestore.
Syntaxe
Les trois types de tables utilisent le paramètre 'connector'='ots' dans la clause WITH, accompagné d'options spécifiques au type.
Table de destination
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'
);
Une table de destination Tablestore requiert une clé primaire. Chaque enregistrement de sortie est ajouté à la table pour mettre à jour les données existantes.
Table de dimension
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}'
);
Table source
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'
);
Métadonnées disponibles
La table source Tablestore expose deux champs de métadonnées via le mot-clé METADATA. Utilisez ces champs pour suivre le type d'opération et l'horodatage de chaque événement de modification.
| Clé de métadonnée | Type de données Flink | Description |
|---|---|---|
type |
STRING | Type d'opération de données (mappé vers OtsRecordType). |
timestamp |
BIGINT | Horodatage de l'opération de données en microsecondes (mappé vers OtsRecordTimestamp). Défini sur 0 pour les lectures de données complètes. |
Pour lire les champs de métadonnées, déclarez-les avec la syntaxe 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 (
...
);
Options du connecteur
Options générales
Tous les types de tables partagent les options suivantes.
| Option | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
connector |
String | Oui | — | Définissez la valeur sur ots. |
instanceName |
String | Oui | — | Nom de l'instance Tablestore. |
endPoint |
String | Oui | — | Endpoint de l'instance Tablestore. Consultez la rubrique Endpoints. |
tableName |
String | Oui | — | Nom de la table. |
accessId |
String | Oui | — | ID AccessKey de votre compte Alibaba Cloud ou d'un utilisateur Resource Access Management (RAM). Consultez la rubrique How do I view the AccessKey ID and AccessKey secret? |
accessKey |
String | Oui | — | Secret AccessKey de votre compte Alibaba Cloud ou d'un utilisateur RAM. |
connectTimeout |
Integer | Non | 30000 | Délai de connexion en millisecondes. |
socketTimeout |
Integer | Non | 30000 | Délai d'expiration du socket en millisecondes. |
ioThreadCount |
Integer | Non | 4 | Nombre de threads d'E/S. |
callbackThreadPoolSize |
Integer | Non | 4 | Taille du pool de threads de rappel. |
Utilisez des variables pour stocker votre paire AccessKey au lieu de l'encoder en dur.
Options de la table source
| Option | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
tunnelName |
String | Oui | — | Nom du tunnel Tablestore. Créez le tunnel dans la console Tablestore avant d'utiliser cette option. Types de tunnels pris en charge : incrémentiel, complet et différentiel. Consultez la section « Create a tunnel » de la rubrique Quick start. |
ignoreDelete |
Boolean | Non | false | Indique s'il faut ignorer les opérations de suppression. true : ignorer ; false : traiter les opérations de suppression. |
skipInvalidData |
Boolean | Non | false | Indique s'il faut ignorer les données incorrectes. true : ignorer les données incorrectes ; false : signaler une erreur. Nécessite Ververica Runtime (VVR) 8.0.4 ou version ultérieure. |
retryStrategy |
Enum | Non | TIME | Politique de nouvelle tentative. TIME : réessayer jusqu'à l'expiration du délai défini par retryTimeoutMs ; COUNT : réessayer jusqu'à atteindre le nombre défini par retryCount. |
retryCount |
Integer | Non | 3 | Nombre maximal de nouvelles tentatives. S'applique lorsque retryStrategy est défini sur COUNT. |
retryTimeoutMs |
Integer | Non | 180000 | Délai d'attente des nouvelles tentatives en millisecondes. S'applique lorsque retryStrategy est défini sur TIME. |
streamOriginColumnMapping |
String | Non | — | Mappage des noms de colonnes d'origine vers les noms de colonnes réels. Format : origin_col1:col1,origin_col2:col2. |
outputSpecificRowType |
Boolean | Non | false | Indique s'il faut transmettre le type de ligne spécifique. false : toutes les lignes sont traitées comme des INSERT ; true : les lignes peuvent être de type INSERT, DELETE ou UPDATE_AFTER. |
dataFetchTimeoutMs |
Integer | Non | 10000 | Temps maximal en millisecondes pour récupérer les données d'une seule partition. Réduisez cette valeur pour diminuer la latence globale de synchronisation lors de la synchronisation de nombreuses partitions. Nécessite VVR 8.0.10 ou version ultérieure. |
enableRequestCompression |
Boolean | Non | false | Indique s'il faut activer la compression des requêtes. Réduit l'utilisation de la bande passante au prix d'une charge CPU plus élevée. Nécessite VVR 8.0.10 ou version ultérieure. |
Options de la table de destination
| Option | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
valueColumns |
String | Oui | — | Noms des colonnes à écrire. Séparez plusieurs noms de colonnes par des virgules (,). |
retryIntervalMs |
Integer | Non | 1000 | Intervalle de nouvelle tentative en millisecondes. |
maxRetryTimes |
Integer | Non | 10 | Nombre maximal de nouvelles tentatives. |
bufferSize |
Integer | Non | 5000 | Nombre maximal d'enregistrements mis en mémoire tampon avant le déclenchement d'une écriture. |
batchWriteTimeoutMs |
Integer | Non | 5000 | Délai d'écriture en millisecondes. Si les enregistrements mis en mémoire tampon n'atteignent pas la valeur bufferSize durant cette période, tous les enregistrements en mémoire tampon sont écrits. |
batchSize |
Integer | Non | 100 | Nombre d'enregistrements écrits par lot. Maximum : 200. |
ignoreDelete |
Boolean | Non | false | Indique s'il faut ignorer les opérations de suppression. |
autoIncrementKey |
String | Non | — | Nom de la colonne de clé primaire à incrémentation automatique. Configurez ce paramètre uniquement si la table de destination possède une colonne de clé primaire à incrémentation automatique. Nécessite VVR 8.0.4 ou version ultérieure. |
overwriteMode |
Enum | Non | PUT | Mode d'écriture. PUT : écraser en mode PUT ; UPDATE : écraser en mode UPDATE. Le mode de colonne dynamique nécessite la valeur UPDATE. |
defaultTimestampInMillisecond |
Long | Non | -1 | Horodatage par défaut pour les écritures. Si non défini, l'heure système actuelle est utilisée. |
dynamicColumnSink |
Boolean | Non | false | Indique s'il faut activer le mode de colonne dynamique. Dans ce mode, aucune colonne n'est prédéfinie ; les colonnes sont insérées en fonction des valeurs d'exécution. Les N premières colonnes définissent la clé primaire. L'avant-dernière colonne contient le nom de la colonne et la dernière colonne contient sa valeur — les deux doivent être de type STRING. Si activé, overwriteMode doit être défini sur UPDATE et les clés primaires à incrémentation automatique ne sont pas prises en charge. |
checkSinkTableMeta |
Boolean | Non | true | Indique s'il faut vérifier que la clé primaire de la table Tablestore correspond à la clé primaire déclarée dans l'instruction CREATE TABLE. |
enableRequestCompression |
Boolean | Non | false | Indique s'il faut activer la compression des requêtes lors des écritures. |
maxColumnsCount |
Integer | Non | 128 | Nombre maximal de colonnes écrites dans la table de destination. Si la valeur dépasse 128, l'erreur The count of attribute columns exceeds the maximum se produit. Nécessite VVR 8.0.10 ou version ultérieure. |
storageType |
String | Non | WIDE_COLUMN |
Type de table de destination. WIDE_COLUMN : table à colonnes larges ; TIMESERIES : table de séries temporelles. |
Options de la table de dimension
Fonctionnement du cache
Le cache de la table de dimension réduit les recherches répétées dans Tablestore. Choisissez une politique de cache en fonction de la taille de votre table et de vos modèles de requête :
None : aucune mise en cache. Chaque recherche interroge directement Tablestore. Utilisez cette option lorsque les données changent fréquemment et que la fraîcheur des données est critique.
LRU : met en cache un nombre fixe d'enregistrements récemment consultés. Lorsqu'une recherche échoue dans le cache, le connecteur interroge Tablestore et met à jour le cache avec le résultat. Définissez les paramètres
cacheSizeetcacheTTLMslors de l'utilisation de cette politique.ALL (par défaut) : charge l'intégralité de la table de dimension dans le cache avant le démarrage du job. Toutes les recherches suivantes sont servies depuis le cache. Lorsque le cache expire (paramètre
cacheTTLMs), le connecteur recharge toutes les données. Utilisez ALL lorsque la table est petite et que vous prévoyez de nombreuses recherches de clés manquantes. Lors de l'utilisation de ALL, augmentez la mémoire du nœud de jointure — le cache nécessite environ deux fois la taille de la table distante.
| Option | Type | Obligatoire | Valeur par défaut | Description |
|---|---|---|---|---|
retryIntervalMs |
Integer | Non | 1000 | Intervalle de nouvelle tentative en millisecondes. |
maxRetryTimes |
Integer | Non | 10 | Nombre maximal de nouvelles tentatives. |
cache |
String | Non | ALL | Politique de cache : None, LRU ou ALL. |
cacheSize |
Integer | Non | — | Nombre maximal d'enregistrements mis en cache. S'applique lorsque cache est défini sur LRU. |
cacheTTLMs |
Integer | Non | — | Durée de vie du cache (TTL) en millisecondes. Pour LRU : délai d'expiration par entrée. Pour ALL : intervalle de rafraîchissement complet du cache. Laissez vide pour désactiver l'expiration. |
cacheEmpty |
Boolean | Non | — | Indique s'il faut mettre en cache les résultats vides (aucune correspondance). true : mettre en cache ; false : ne pas mettre en cache. |
cacheReloadTimeBlackList |
String | Non | — | Plages horaires durant lesquelles le cache ALL n'est pas actualisé. Format : 2017-10-24 14:00 -> 2017-10-24 15:00, 2017-11-10 23:30 -> 2017-11-11 08:00. Séparez plusieurs plages par des virgules ; utilisez -> entre les heures de début et de fin. |
async |
Boolean | Non | false | Indique s'il faut activer la recherche asynchrone. true : recherches asynchrones (les résultats ne sont pas ordonnés) ; false : recherches synchrones. |
Mappages de types de données
Table source
| Type Tablestore | Type Flink SQL |
|---|---|
| INTEGER | BIGINT |
| STRING | STRING |
| BOOLEAN | BOOLEAN |
| DOUBLE | DOUBLE |
| BINARY | BINARY |
Table de destination
| Type Flink SQL | Type Tablestore |
|---|---|
| BINARY | BINARY |
| VARBINARY | BINARY |
| CHAR | STRING |
| VARCHAR | STRING |
| TINYINT | INTEGER |
| SMALLINT | INTEGER |
| INTEGER | INTEGER |
| BIGINT | INTEGER |
| FLOAT | DOUBLE |
| DOUBLE | DOUBLE |
| BOOLEAN | BOOLEAN |
Exemples
Lire depuis Tablestore et écrire dans Tablestore
Cet exemple lit les données de commande depuis une table source Tablestore via Tunnel Service et les écrit dans une table de destination Tablestore. La table de destination utilise une colonne de clé primaire à incrémentation automatique.
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;
Synchroniser une table à colonnes larges vers une table de séries temporelles
Cet exemple lit depuis une table source à colonnes larges et écrit dans une table de destination de séries temporelles. La colonne tags de la table de destination utilise le type MAP<STRING, STRING> pour contenir les paires clé-valeur des tags, et le paramètre storageType est défini sur 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;