Utilisez le connecteur SQL JDBC d'Apache Flink pour écrire des données en flux continu ou par lots dans un cluster AnalyticDB for MySQL Data Warehouse Edition. Ce guide couvre les versions 1,11 et ultérieures de Flink.
Ce guide utilise Apache Flink SQL. Pour écrire des données à l'aide de l'API Java Database Connectivity (JDBC) de Flink, consultez la documentation JDBC Connector.
Prérequis
Avant de commencer, vérifiez que :
Un cluster AnalyticDB for MySQL Data Warehouse Edition est disponible, avec une base de données et une table prêtes à recevoir les données. Consultez les rubriques CREATE DATABASE et CREATE TABLE.
Un cluster Apache Flink exécute la version 1,11 ou ultérieure.
Le fichier JAR du connecteur Flink JDBC et un pilote MySQL (version 5.1.40 ou ultérieure) sont déployés dans le répertoire
${Flink deployment directory}/libsur tous les nœuds Flink, et le cluster a été redémarré après le déploiement.(Pour les clusters en mode élastique uniquement) L'ENI est activée sur la page Cluster Information sous la section Network Information.
L'activation ou la désactivation de l'ENI interrompt toutes les connexions à la base de données pendant environ 2 minutes ; les opérations de lecture et d'écriture sont alors indisponibles.
Télécharger les fichiers JAR requis
Connecteur Flink JDBC
Téléchargez le fichier JAR du connecteur correspondant à votre version de Flink. Pour les versions non répertoriées ci-dessous, consultez la documentation JDBC SQL Connector.
| Version de Flink | Fichier JAR |
|---|---|
| 1,11 | flink-connector-jdbc_2.11-1.11.0.jar |
| 1,12 | flink-connector-jdbc_2.11-1.12.0.jar |
| 1,13 | flink-connector-jdbc_2.11-1.13.0.jar |
Pilote MySQL
Téléchargez un pilote MySQL (version 5.1.40 ou ultérieure) depuis le dépôt mysql/mysql-connector-java.
Placez les deux fichiers JAR dans le répertoire lib de chaque nœud Flink, puis redémarrez le cluster. Pour obtenir des instructions sur le démarrage du cluster, consultez la rubrique Step 2: Start a cluster.
Compatibilité des versions pour les anciennes versions de Flink
Pour les versions de Flink antérieures à la 1,11 :
Flink 1.9 et 1.10 : Connecteur JDBC Flink v1.10
Flink 1.8 et versions antérieures : Flink v1.8 JDBCAppendTableSink
Étape 1 : Préparer les données source
Cet exemple utilise un fichier CSV local comme source de données.
-
Sur n'importe quel nœud Flink, créez le fichier
/root/data.csvavec le contenu suivant :0,json00,20 1,json01,21 2,json02,22 3,json03,23 4,json04,24 5,json05,25 6,json06,26 7,json07,27 8,json08,28 9,json09,29 Copiez ce fichier vers
/root/data.csvsur tous les autres nœuds Flink. Le chemin d'accès doit être identique sur chaque nœud.
Étape 2 : Écrire les données dans AnalyticDB for MySQL
Exécutez toutes les commandes SQL de cette étape dans l'interface CLI du client SQL Flink. Pour la démarrer, consultez la rubrique Starting the SQL Client CLI.
Créer la table source
Créez une table source Flink qui lit les données depuis le fichier CSV :
CREATE TABLE IF NOT EXISTS csv_person (
`user_id` STRING,
`user_name` STRING,
`age` INT
) WITH (
'connector' = 'filesystem',
'path' = 'file:///root/data.csv',
'format' = 'csv',
'csv.ignore-parse-errors' = 'true',
'csv.allow-comments' = 'true'
);
Les noms de colonnes et les types de données doivent correspondre à ceux de la table de destination dans AnalyticDB for MySQL. La valeur du paramètre path doit pointer vers le même chemin absolu sur chaque nœud Flink. Pour connaître les autres options de connecteur, consultez la documentation FileSystem SQL Connector.
Créer la table de résultat
Créez une table de résultat Flink qui correspond à la table de destination dans AnalyticDB for MySQL :
CREATE TABLE mysql_person (
user_id STRING,
user_name STRING,
age INT
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://<endpoint>:<port>/<db_name>?useServerPrepStmts=false&rewriteBatchedStatements=true',
'table-name' = '<table_name>',
'username' = '<username>',
'password' = '<password>',
'sink.buffer-flush.max-rows' = '10',
'sink.buffer-flush.interval' = '1s'
);
Remplacez les espaces réservés suivants avant d'exécuter cette instruction :
| Espace réservé | Description | Exemple |
|---|---|---|
<endpoint> |
Endpoint du cluster. Pour utiliser un endpoint public, vous devez d'abord en faire la demande. | am-**********.ads.aliyuncs.com |
<port> |
Port du cluster | 3306 |
<db_name> |
Nom de la base de données de destination | tpch |
<table_name> |
Nom de la table de destination | person |
<username> |
Compte de base de données disposant des autorisations d'écriture. Exécutez la commande SHOW GRANTS pour vérifier les autorisations, ou utilisez GRANT pour les attribuer. | — |
<password> |
Mot de passe du compte de base de données | — |
Paramètres du connecteur
| Paramètre | Obligatoire | Par défaut | Description |
|---|---|---|---|
connector |
Oui | — | Définissez la valeur sur jdbc. |
url |
Oui | — | URL JDBC du cluster. La chaîne de requête useServerPrepStmts=false&rewriteBatchedStatements=true active les écritures par lots pour améliorer le débit et réduire la charge sur le cluster. |
table-name |
Oui | — | Nom de la table de destination. |
username |
Oui | — | Compte de base de données disposant des autorisations d'écriture. |
password |
Oui | — | Mot de passe du compte. |
sink.buffer-flush.max-rows |
Non | — | Nombre maximal de lignes par lot. Définissez la valeur sur 0 pour effectuer la vidange uniquement selon l'intervalle de temps. Exemples de valeurs non nulles : 1000, 2000. Évitez de définir la valeur sur 0, car cela dégrade le débit d'écriture lors de requêtes concurrentes. |
sink.buffer-flush.interval |
Non | — | Temps maximal entre deux vidanges. Définissez la valeur sur 0 pour effectuer la vidange uniquement lorsque max-rows est atteint. Exemples de valeurs non nulles : 1d, 1h, 1min, 1s, 1ms. Évitez de définir la valeur sur 0, car les données peuvent être retardées pendant les périodes de faible trafic. |
Pour connaître toutes les options disponibles du connecteur, consultez la rubrique Connector options.
Comportement de vidange
Lorsque les paramètres sink.buffer-flush.max-rows et sink.buffer-flush.interval sont tous deux définis sur des valeurs non nulles, une vidange est déclenchée dès que l'une des conditions suivantes est remplie :
Le nombre de lignes mises en tampon atteint la valeur de
sink.buffer-flush.max-rows.Le temps écoulé depuis la dernière vidange atteint la valeur de
sink.buffer-flush.interval.
Exécuter l'importation
Exécutez l'instruction suivante pour commencer à écrire les données de la table source vers AnalyticDB for MySQL :
INSERT INTO mysql_person SELECT user_id, user_name, age FROM csv_person;
Si la table de destination possède une clé primaire et que les données source contiennent des valeurs de clé primaire en double, l'instruction INSERT INTO se comporte comme INSERT IGNORE INTO : les lignes en double sont ignorées au lieu d'être insérées à nouveau. Consultez la rubrique INSERT INTO.
Étape 3 : Vérifier les données
Une fois la tâche terminée, connectez-vous à la base de données tpch de votre cluster AnalyticDB for MySQL et exécutez la commande suivante :
SELECT * FROM person;