Chapitre 1 Introduction
En cette occasion festive, souhaitons tout d'abord à tous les lecteurs une bonne fête nationale et la fête de la mi-automne!
Après l'introduction des articles précédents, je pense que vous comprenez déjà le déploiement et l'utilisation de Flink dans l'environnement de production. Ensuite, la question se pose: est-ce que chaque développeur Flink doit déployer et installer un cluster pour faire du développement? La réponse est bien sûr non. Si chaque développeur a besoin d'un cluster, le coût de développement sera trop élevé. Cet article prend comme exemple l'API / SQL de Flink Table, utilise Kafka comme source de données, Mysql comme puits de données et utilise un conteneur pour introduire l'établissement et l'utilisation de l'environnement de développement Flink. (Remarque: l'auteur prend Windows comme exemple, le système mac est similaire)
Chapitre 2 Installation des composants
2.1 Installer docker sur le site officiel
Je ne le présenterai pas en détail ici, vous pouvez le télécharger et l'installer sur le site officiel ( https://www.docker.com ).
2.2 Définir l'adresse de l'entrepôt du miroir domestique
2.3 Version du docker de requête
C:\Users\zihao>docker --version
Docker version 19.03.12, build 48a66213fe
2.4 Une robe kafka
安装前可先查询kafka相关镜像
docker search kafka
Miroir Pull Kafka
C:\Users\zihao>docker pull wurstmeister/kafka:2.12-2.5.0
2.12-2.5.0: Pulling from wurstmeister/kafka
Image docker.io/wurstmeister/kafka:2.12-2.5.0 uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
e7c96db7181b: Retrying in 1 second f910a506b6cb: Retrying in 1 second b6abafe80f63: Downloading 2e9c2caa5758: Waiting 1b29071c565f: Waiting c81626d038e3: Waiting 2.12-2.5.0: Pulling from wurstmeister/kafka
e7c96db7181b: Pull complete f910a506b6cb: Pull complete b6abafe80f63: Pull complete 2e9c2caa5758: Pull complete 1b29071c565f: Pull complete c81626d038e3: Pull complete Digest: sha256:71aa89afe97d3f699752b6d80ddc2024a057ae56407f6ab53a16e9e4bedec04c
Status: Downloaded newer image for wurstmeister/kafka:2.12-2.5.0
docker.io/wurstmeister/kafka:2.12-2.5.0
2.5 installer le gardien de zoo
Miroir de gardien de zoo
C:\Users\zihao>docker pull zookeeper:3.5.7
3.5.7: Pulling from library/zookeeper
afb6ec6fdc1c: Pulling fs layer ee19e84e8bd1: Pulling fs layer 6ac787417531: Pulling fs layer f3f781d4d83e: Waiting 424c9e43d19a: Waiting f0929561e8a7: Waiting f1cf0c087cb3: Waiting 2f47bb4dd07a: Waiting 3.5.7: Pulling from library/zookeeper
afb6ec6fdc1c: Pulling fs layer ee19e84e8bd1: Pulling fs layer 6ac787417531: Pulling fs layer f3f781d4d83e: Waiting 424c9e43d19a: Waiting f0929561e8a7: Waiting f1cf0c087cb3: Waiting 2f47bb4dd07a: Waiting 3.5.7: Pulling from library/zookeeper
afb6ec6fdc1c: Pull complete ee19e84e8bd1: Pull complete 6ac787417531: Pull complete f3f781d4d83e: Pull complete 424c9e43d19a: Pull complete f0929561e8a7: Pull complete f1cf0c087cb3: Pull complete 2f47bb4dd07a: Pull complete Digest: sha256:883b014b6535574503bda8fc6a7430ba009c0273242f86d401095689652e5731
Status: Downloaded newer image for zookeeper:3.5.7
docker.io/library/zookeeper:3.5.7
2.6 Installer Mysql
C:\Users\zihao>docker pull mysql:5.7
5.7: Pulling from library/mysql
Image docker.io/library/mysql:5.7 uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
d121f8d1c412: Downloading f3cebc0b4691: Downloading 1862755a0b37: Downloading 489b44f3dbb4: Downloading 690874f836db: Downloading baa8be383ffb: Downloading 55356608b4ac: Downloading 277d8f888368: Downloading 21f2da6feb67: Downloading 2c98f818bcb9: Downloading 031b0a770162: Downloading 5.7: Pulling from library/mysql
d121f8d1c412: Pull complete f3cebc0b4691: Pull complete 1862755a0b37: Pull complete 489b44f3dbb4: Pull complete 690874f836db: Pull complete baa8be383ffb: Pull complete 55356608b4ac: Pull complete 277d8f888368: Pull complete 21f2da6feb67: Pull complete 2c98f818bcb9: Pull complete 031b0a770162: Pull complete Digest: sha256:14fd47ec8724954b63d1a236d2299b8da25c9bbb8eacc739bb88038d82da4919
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
2.7 Afficher les images miroir installées
C:\Users\zihao>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 ef08065b0a30 3 days ago 448MB
wurstmeister/kafka 2.12-2.5.0 caa449bd6c28 3 weeks ago 431MB
zookeeper 3.5.7 6bd990489b09 4 months ago 245MB
Chapitre 3 Démarrage du conteneur
3.1 Démarrer le gardien de zoo
C:\Users\zihao>docker run -d --name zookeeper -p 2181:2181 -t zookeeper:3.5.7
5a29cfcb77c1bbd33eedf41add46da89b91468d09702acde5caa3086b6cc467e
3.2 Démarrer Kafka
C:\Users\zihao>docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --env KAFKA_ADVERTISED_HOST_NAME=127.0.0.1 --env KAFKA_ADVERTISED_PORT=9092 wurstmeister/kafka:2.12-2.5.0
e45499f971d1efd59227031f41631d1cf6e9e13b7950872efbf96dcbb5f998fb
3.3 Démarrez Mysql
C:\Users\zihao>docker run -p 3306:3306 --name mysql -v D:/21docker/mysql/conf:/etc/mysql/conf.d -v D:/21docker/mysql/logs:/logs -v D:/21docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
2bea9be2ccdbea6f41c9a4dedc7d3bf8efa5538b39e19dea43eb66f4df100bb7
Notez le chemin de montage avec le paramètre -v
3.4 Afficher le conteneur démarré
C:\Users\zihao>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f4d03dee765 mysql:5.7 "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, 33060/tcp mysql
e45499f971d1 wurstmeister/kafka:2.12-2.5.0 "start-kafka.sh" 47 minutes ago Up 47 minutes 0.0.0.0:9092->9092/tcp kafka
5a29cfcb77c1 zookeeper:3.5.7 "/docker-entrypoint.…" 52 minutes ago Up 52 minutes 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp zookeeper
3.5 Vérifier le fonctionnement de Kafka
Entrez dans le conteneur kafka
C:\Users\zihao>docker exec -it kafka /bin/bash
Vers le répertoire kafka
bash-4.4# cd opt/kafka
Nouveau sujet
bash-4.4# bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic test
Created topic test.
Commande pour démarrer le producteur
bash-4.4# bin/kafka-console-producer.sh --topic=test --broker-list localhost:9092
>
Démarrer un consommateur
bash-4.4# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 -from-beginning --topic test
Envoyez des données pour voir si la consommation est normale
Le producteur envoie des données
bash-4.4# bin/kafka-console-producer.sh --topic=test --broker-list localhost:9092
>hello
>flink
>
Données de consommation des consommateurs
bash-4.4# bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 -from-beginning --topic test
hello
flink
Vous pouvez voir que la génération de messages et la consommation de Kafka sont normales, ce qui prouve que l'installation de Kafka a été normale.
3.6 Vérifier le fonctionnement de mysql
C:\Users\zihao>docker exec -it mysql bash
root@5f4d03dee765:/# mysql -h localhost -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.31 MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.02 sec)
Vous pouvez voir la base de données dans mysql, ce qui prouve que mysql est également installé et fonctionne normalement.
Chapitre 4 Running Flink
4.1 Créer un sujet Kafka
bash-4.4# bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --topic country-log
Created topic country-log.
4.2 Créer une table Mysql
Construire une bibliothèque
mysql> create database flinkdb;
Construire une table
mysql> create table country_log(country_id bigint,country_msg varchar(100));
4.3 Démarrer le producteur Kafka
bash-4.4# bin/kafka-console-producer.sh --topic=country-log --broker-list localhost:9092
4.4 Mission d'écriture d'idées
package sql;
import org.apache.flink.api.common.restartstrategy.RestartStrategies;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.runtime.state.filesystem.FsStateBackend;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.TableEnvironment;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import java.util.concurrent.TimeUnit;
/**
* Kafka生产的数据:
* {"country_id":"1","country_msg":"hello flink!"}
* MySql建表语句:
* create table country(country_id bigint,country_msg varchar(100));
*/
public class Kafka2Mysql {
public static void main(String[] args) throws Exception {
// Kafka source
String sourceSQL="CREATE TABLE demo_source (country_id BIGINT,country_msg STRING)\n" +
" WITH (\n" +
" 'connector' = 'kafka-0.11',\n" +
" 'topic'='country-log',\n" +
" 'properties.bootstrap.servers'='localhost:9092',\n" +
" 'format' = 'json',\n" +
" 'scan.startup.mode' = 'latest-offset'\n" +
")";
//Mysql sink
String sinkSQL="CREATE TABLE demo_sink (country_id BIGINT,country_msg STRING)\n" +
" WITH (" +
" 'connector' = 'jdbc',\n" +
" 'url' = 'jdbc:mysql://localhost:3306/flinkdb?characterEncoding=utf-8&useSSL=false',\n" +
" 'table-name' = 'country_log',\n" +
" 'username' = 'root',\n" +
" 'password' = '123456',\n" +
" 'sink.buffer-flush.max-rows' = '1',\n" +
" 'sink.buffer-flush.interval' = '1s'\n" +
")";
// 创建执行环境
EnvironmentSettings settings=EnvironmentSettings
.newInstance()
.useBlinkPlanner()
.inStreamingMode()
.build();
//TableEnvironment tEnv = TableEnvironment.create(settings);
StreamExecutionEnvironment sEnv = StreamExecutionEnvironment.getExecutionEnvironment();
sEnv.setRestartStrategy(RestartStrategies.fixedDelayRestart(3, Time.of(1, TimeUnit.SECONDS)));
//sEnv.enableCheckpointing(1000);
//sEnv.setStateBackend(new FsStateBackend("file:///tmp/chkdir",false));
StreamTableEnvironment tEnv= StreamTableEnvironment.create(sEnv,settings);
//注册souuce
tEnv.executeSql(sourceSQL);
//注册sink
tEnv.executeSql(sinkSQL);
//数据提取
Table sourceTable=tEnv.from("demo_source");
//发送数据
sourceTable.executeInsert("demo_sink");
//执行作业
tEnv.execute("Hello Flink");
}
}
Exécutez le programme ci-dessus directement dans Idea.
À ce stade, les programmes d'exploitation Kafka, Mysql et Flink sont tous en cours d'exécution, puis nous commençons à générer des données et à afficher les données.
4.5 Données de production en ligne de commande
Accédez à la ligne de commande kafka pour produire manuellement des messages
bash-4.4# bin/kafka-console-producer.sh --topic=country-log --broker-list localhost:9092
>{"country_id":"1","country_msg":"hello flink!"}
>{"country_id":"2","country_msg":"hello flink!"}
>
4.6 Afficher les données dans Mysql
Les données arrivent à Mysql via Kafka-Flink, vérifiez les données dans Mysql
mysql> select * from country_log;
+------------+--------------+
| country_id | country_msg |
+------------+--------------+
| 1 | hello flink! |
| 2 | hello flink! |
+------------+--------------+
2 rows in set (0.01 sec)
Jusqu'à présent, nous avons migré avec succès de Kafka vers l'aval Mysql via Flink, et terminé la mise en place et l'utilisation de Flink dans l'environnement de développement local. Mais cet article fait simplement circuler les données via Flink, et il n'y a pas d'activité complète de bout en bout. Le prochain article vous présentera un cas complet de bout en bout couvrant l'informatique Flink . Dans l'attente de votre attention continue!