Tous les produits
Search
Centre de documentation

Realtime Compute for Apache Flink:Tablestore

Dernière mise à jour :Aug 09, 2026

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.
Important

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 cacheSize et cacheTTLMs lors 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;

Étapes suivantes