Le connecteur AnalyticDB for MySQL V3.0 permet de lire et d'écrire dans des clusters AnalyticDB for MySQL V3.0 via Flink SQL. AnalyticDB for MySQL est un service d'entrepôt de données cloud-native qui prend en charge les écritures en temps réel à haut débit, l'analytique à faible latence et les opérations complexes d'extraction, de transformation et de chargement (ETL).
Le connecteur prend en charge les types de table et fonctionnalités suivants :
| Élément | Description |
|---|---|
| Types de table | Table source, table de dimension et table de destination. Remarque
Les tables sources nécessitent Ververica Runtime (VVR) 8.0.4 ou une version ultérieure. Pour connaître les paramètres des tables sources, consultez la rubrique Utilisation de Flink pour s'abonner aux journaux binaires. |
| Modes d'exécution | Mode streaming et mode batch |
| Format des données | S.O. |
| Métriques | S.O. |
| Type d'API | API SQL |
| Mise à jour et suppression des données dans les tables de destination | Prise en charge |
Prérequis
Avant de commencer, vérifiez que vous disposez des éléments suivants :
Un cluster AnalyticDB for MySQL et une table. Consultez les rubriques Création d'un cluster et CREATE TABLE
Une liste d'autorisation d'adresses IP configurée pour le cluster. Consultez la rubrique Configuration d'une liste d'autorisation d'adresses IP
Syntaxe
CREATE TEMPORARY TABLE adb_table (
`id` INT,
`num` BIGINT,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'adb3.0',
'url' = 'jdbc:mysql://<endpoint>:<port>/<databaseName>',
'userName' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTablename>'
);
La clé primaire définie dans l'instruction DDL Flink doit correspondre à la clé primaire de la table physique dans AnalyticDB for MySQL : mêmes champs, mêmes noms, présents dans les deux. Des clés primaires non concordantes peuvent entraîner une corruption des données.
Comportements clés
Clé primaire et mode d'écriture
Lorsqu'une clé primaire est définie dans le DDL, le connecteur fonctionne en mode upsert : les clés primaires en double déclenchent une mise à jour plutôt qu'une nouvelle insertion. Le comportement SQL exact dépend du paramètre replaceMode :
replace— utiliseREPLACE INTO. Une clé primaire en double écrase la ligne existante dans son intégralité.upsert— utiliseINSERT INTO ... ON DUPLICATE KEY UPDATE. Seuls les champs spécifiés sont mis à jour ; les autres champs conservent leurs valeurs actuelles.insert— utiliseINSERT IGNORE INTO. Les clés primaires en double sont ignorées silencieusement ; la ligne existante est conservée.
En l'absence de clé primaire, le connecteur utilise toujours INSERT IGNORE INTO.
Le paramètrereplaceModenécessite AnalyticDB for MySQL V3.1.3.5 ou une version ultérieure et VVR 11.2 ou une version ultérieure pour les valeurs de chaîne (replace,upsert,insert). Les versions antérieures de VVR utilisenttrue(équivalent àreplace) etfalse(équivalent àupsert). VVR 11.2 et les versions ultérieures restent compatibles avectrueetfalse.
Mise en mémoire tampon des écritures
Le connecteur met les enregistrements en mémoire tampon et les vide par lots. Un vidage est déclenché lorsque l'une des conditions suivantes est remplie :
Le nombre d'enregistrements en mémoire tampon atteint
batchSize(par défaut : 1 000) oubufferSize(par défaut : 1 000)Le temps écoulé depuis le dernier vidage atteint
flushIntervalMs(par défaut : 3 000 ms)
Les paramètres batchSize et bufferSize ne prennent effet que lorsqu'une clé primaire est définie.
Mise en cache des tables de dimension
Le connecteur prend en charge trois stratégies de mise en cache pour les tables de dimension. La mise en cache réduit le nombre de recherches dans la table physique, mais nécessite davantage de mémoire.
| Stratégie de cache | Comportement | Cas d'utilisation |
|---|---|---|
ALL (par défaut) |
Toutes les données de la table de dimension sont chargées en mémoire avant le démarrage de la tâche. Les recherches ultérieures interrogent uniquement le cache. Les données sont rechargées après l'expiration de cacheTTLMs. |
La table de dimension est petite et les clés manquantes sont fréquentes |
LRU |
Les lignes fréquemment consultées sont mises en cache. En cas d'absence du cache, le connecteur interroge la table physique et met à jour le cache. Les entrées expirent après cacheTTLMs. |
La table de dimension est volumineuse, mais l'accès se concentre sur un sous-ensemble de clés |
None |
Aucune mise en cache. Chaque recherche interroge directement la table physique. | Volume de recherches faible ou exigences strictes en matière d'actualité des données |
Avec la mise en cache ALL, le connecteur charge de manière asynchrone la table de dimension complète en mémoire. Vous devez augmenter la mémoire du nœud utilisé pour la jointure des tables — l'augmentation requise est au moins deux fois supérieure à la taille de la table distante — afin d'éviter les erreurs d'épuisement de la mémoire (OOM). Surveillez l'utilisation de la mémoire du nœud pendant l'exécution de la tâche.
Paramètres de la clause WITH
Paramètres communs
| Paramètre | Type | Obligatoire | Par défaut | Description |
|---|---|---|---|---|
connector |
String | Oui | — | Définissez sur adb3.0 |
url |
String | Oui | — | URL Java Database Connectivity (JDBC) de la base de données, au format jdbc:mysql://<endpoint>:<port>/<databaseName>. Obtenez le endpoint et le port depuis la section Network Information de la page de votre cluster dans la console AnalyticDB for MySQL. |
userName |
String | Oui | — | Nom d'utilisateur pour l'accès à la base de données |
password |
String | Oui | — | Mot de passe pour l'accès à la base de données |
tableName |
String | Oui | — | Nom de la table cible dans la base de données |
maxRetryTimes |
Integer | Non | 10 | Nombre maximal de tentatives en cas d'échec de lecture ou d'écriture |
Paramètres de la table de destination
| Paramètre | Type | Obligatoire | Par défaut | Description |
|---|---|---|---|---|
batchSize |
Integer | Non | 1000 | Nombre d'enregistrements écrits par lot. Ne prend effet que lorsqu'une clé primaire est définie. |
bufferSize |
Integer | Non | 1000 | Nombre maximal d'enregistrements mis en mémoire tampon avant le déclenchement d'un vidage. Ne prend effet que lorsqu'une clé primaire est définie. |
flushIntervalMs |
Integer | Non | 3000 | Temps maximal (en millisecondes) entre les vidages. Lorsque cet intervalle est écoulé, tous les enregistrements en mémoire tampon sont écrits, quelle que soit la taille du tampon. |
ignoreDelete |
Boolean | Non | false | Indique s'il faut ignorer les opérations de suppression. Définissez sur true pour ignorer les suppressions ; sur false pour les appliquer. |
replaceMode |
Boolean | Non | true |
Mode d'écriture lorsqu'une clé primaire est définie. VVR 11.2+ : replace, upsert ou insert. Versions antérieures : true (identique à replace) ou false (identique à upsert). Nécessite AnalyticDB for MySQL V3.1.3.5 ou une version ultérieure. Ne prend effet que lorsqu'une clé primaire est définie dans le DDL ; sinon, INSERT IGNORE INTO est toujours utilisé. |
excludeUpdateColumns |
String | Non | (vide) | Liste séparée par des virgules des colonnes à exclure des mises à jour lorsque replaceMode est défini sur upsert (ou false). En cas de clé primaire en double : seules les colonnes restantes sont mises à jour ; les colonnes exclues conservent leurs valeurs existantes. En cas de clé primaire unique : toutes les colonnes sont insérées. Exemple : excludeUpdateColumns='column1,column2'. La valeur doit tenir sur une seule ligne, sans sauts de ligne. |
connectionMaxActive |
Integer | Non | 40 | Nombre maximal de connexions simultanées à la base de données dans le pool de threads |
Paramètres de la table de dimension
| Paramètre | Type | Obligatoire | Par défaut | Description |
|---|---|---|---|---|
cache |
String | Non | ALL | Stratégie de mise en cache : None, LRU ou ALL. Consultez la section Mise en cache des tables de dimension. |
cacheSize |
Integer | Non | 100000 | Nombre maximal de lignes mises en cache. Requis lorsque cache est défini sur LRU. |
cacheTTLMs |
Integer | Non | Long.MAX_VALUE | Durée de vie des entrées du cache en millisecondes. Pour LRU : les entrées expirent après cette période (par défaut : n'expirent jamais). Pour ALL : le cache complet est rechargé après cette période (par défaut : jamais rechargé). Non utilisé lorsque cache est défini sur None. |
maxJoinRows |
Integer | Non | 1024 | Nombre maximal de lignes de la table de dimension correspondant à chaque enregistrement d'entrée. Si chaque enregistrement d'entrée correspond à au plus n lignes de la table de dimension, définissez ce paramètre sur n pour optimiser les performances de jointure dans Realtime Compute for Apache Flink. |
Mappages de types de données
| AnalyticDB for MySQL V3.0 | Realtime Compute for Apache Flink |
|---|---|
| BOOLEAN | BOOLEAN |
| TINYINT | TINYINT |
| SMALLINT | SMALLINT |
| INT | INT |
| BIGINT | BIGINT |
| FLOAT | FLOAT |
| DOUBLE | DOUBLE |
| DECIMAL(p, s) ou NUMERIC(p, s) | DECIMAL(p, s) |
| VARCHAR | STRING |
| BINARY | BYTES |
| DATE | DATE |
| TIME | TIME |
| DATETIME | TIMESTAMP |
| TIMESTAMP | TIMESTAMP |
| POINT | STRING |
Exemples
Table de destination
L'exemple suivant lit à partir d'une source datagen et écrit les données dans une table de destination AnalyticDB for MySQL.
CREATE TEMPORARY TABLE datagen_source (
`name` VARCHAR,
`age` INT
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE adb_sink (
`name` VARCHAR,
`age` INT
) WITH (
'connector' = 'adb3.0',
'url' = 'jdbc:mysql://<endpoint>:<port>/<databaseName>',
'userName' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTablename>'
);
INSERT INTO adb_sink
SELECT * FROM datagen_source;
Table de dimension
L'exemple suivant joint une source datagen à une table de dimension AnalyticDB for MySQL à l'aide d'une jointure temporelle. Les résultats sont écrits dans une destination blackhole.
CREATE TEMPORARY TABLE datagen_source (
`a` INT,
`b` VARCHAR,
`c` STRING,
`proctime` AS PROCTIME()
) WITH (
'connector' = 'datagen'
);
CREATE TEMPORARY TABLE adb_dim (
`a` INT,
`b` VARCHAR,
`c` VARCHAR
) WITH (
'connector' = 'adb3.0',
'url' = 'jdbc:mysql://<endpoint>:<port>/<databaseName>',
'userName' = '<yourUsername>',
'password' = '<yourPassword>',
'tableName' = '<yourTablename>'
);
CREATE TEMPORARY TABLE blackhole_sink (
`a` INT,
`b` VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO blackhole_sink
SELECT T.a, H.b
FROM datagen_source AS T
JOIN adb_dim FOR SYSTEM_TIME AS OF T.proctime AS H
ON T.a = H.a;