Flink CDC 介绍
源码地址:github.com/apache/flin… Flink CDC是一个基于Apache Flink的实时数据集成框架,它利用数据库日志的变更数据捕获(CDC)技术来实现数据的实时同步。以下是对Flink CDC的具体介绍:
-
基本概念
- 定义:Flink CDC是用于捕获和处理数据库中数据变化的技术,它可以实时地从各种数据库中捕获数据变更,并将其转换为流式数据。
- 核心思想:通过监测并捕获数据库的变动,将这些变更按发生的顺序记录下来,写入到消息中间件中以供其他服务进行订阅及消费。
-
主要特点
- 实时数据捕获:能够实时捕获数据库中的数据变更,并将其转换为流式数据。
- 高性能:基于Flink引擎,具有高性能的数据处理能力。
- 低延迟:可以在毫秒级的延迟下处理大量的数据变更。
- 易集成:与Flink生态系统紧密集成,可以方便地与其他Flink应用程序一起使用。
- 高可用性:支持实时备份和恢复,确保数据的高可用性。
-
实现原理
- 基于查询的CDC:通过定期查询数据库来检测数据变化,适用于数据量小且可以接受一定延迟的场景。
- 基于日志的CDC:通过解析数据库的二进制日志来捕获数据变化,适用于数据量大且需要实时性的场景。
-
应用场景
- 数据同步:将数据从一个数据库实时同步到另一个数据库。
- 数据管道:构建实时数据处理管道,处理和分析数据库中的数据。
- 数据分析:实时分析数据库中的数据,提供实时的业务洞察。
- 实时应用:将数据库中的数据实时应用于实时应用程序,如实时报表、实时推荐等。
- 实时监控:实时监控数据库中的数据,检测异常和错误。
Flink CDC 支持同步到的数据源
- MySQL
- PostgreSQL
- Oracle
- MongoDB
- Flink CDC 1.13 (jdk1.8 )版本支持StarRocks
- Flink作为当前流行的流式计算框架,在对接StarRocks时,若直接使用JDBC的方式“流式”写入数据,对StarRocks是不友好的。为此,StarRocks单独开发了flink-connector-starrocks,其内部实现仍是通过对数据缓存攒批后执行Stream Load导入。
- Flink-connector-starrocks除了支持向StarRocks中写入数据(Sink),也支持了从StarRocks中读取数据(Source)的功能。
- Flink CDC 1.13(JDK1.8)版本支持Doris
- Flink CDC 1.13版本提供了与Doris集成的连接器,允许用户直接从Flink作业中读取Doris的数据,或将数据写入Doris。用户可以在Flink作业中定义数据源和接收器,通过简单的配置即可实现数据的实时同步。
Flink 安装
Apache Flink是一个开源的流处理框架,用于实时数据流和批处理。它支持多种部署模式和集群配置,以满足不同规模和需求的数据处理任务。以下是Flink的一些主要安装和部署模式:
-
本地模式:
- 这是最简单的部署模式,适用于开发和测试。在本地模式下,Flink运行在单个JVM进程中,不需要额外的集群管理工具。
-
独立集群模式:
- 在独立集群模式下,Flink可以作为一个独立的集群运行,不依赖于其他资源管理器。用户需要手动设置和配置集群中的所有节点。
-
Standalone Session Cluster:
- 这是一种特殊的独立集群模式,其中集群资源可以被多个作业共享。用户提交作业到集群时,Flink会为每个作业分配资源。
-
YARN(Yet Another Resource Negotiator) :
- 在这种模式下,Flink与Apache Hadoop YARN集成,利用YARN进行资源管理和作业调度。
-
Mesos:
- Flink可以部署在Apache Mesos集群上,利用Mesos进行资源管理和作业调度。
-
Kubernetes:
- Flink支持在Kubernetes上运行,使用Kubernetes进行资源管理和作业调度。
-
Docker:
- Flink可以部署在Docker容器中,这使得它能够在隔离的环境中运行,便于部署和扩展。
-
Cloud-native部署:
- Flink也可以部署在云服务上,如AWS、Azure、Google Cloud等,利用云服务提供商的资源管理和作业调度。
Flink本地模式搭建
前期准备
Flink版本:flink-1.13.2-bin-scala_2.11.tgz (jdk-1.8)
Flink版本: flink-1.20.0-bin-scala_2.12.tgz (jdk17)
下载地址:flink.apache.org/zh/download…
wget repo.huaweicloud.com/apache/flin…
Flink 驱动
wget -P ./lib/ https://repo1.maven.org/maven2/org/apache/flink/flink-sql-connector-elasticsearch7_2.11/1.13.3/flink-sql-connector-elasticsearch7_2.11-1.13.3.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/org/apache/flink/flink-connector-jdbc_2.11/1.13.3/flink-connector-jdbc_2.11-1.13.3.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/com/ververica/flink-sql-connector-mysql-cdc/2.1.1/flink-sql-connector-mysql-cdc-2.1.1.jar | \
wget -P ./lib/ https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.22/mysql-connector-java-8.0.22.jar
解压,修改配置
目录: conf/flink-conf.yaml
启动 、关闭 、验证
./bin/start-cluster.sh
./stop-cluster.sh
jps
1864 TaskManagerRunner -- 启动成功
1581 StandaloneSessionClusterEntrypoint -- 启动成功
flink+flinkcdc+同步MYSQL到MYSQL 示例
编写同步脚本 flinkSql_007.sql
SET execution.checkpointing.interval = 60s;
drop table if exists products;
CREATE TABLE products (
id INT NOT NULL,
`name` STRING,
description STRING,
create_time TIMESTAMP,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '',
'port' = '3306',
'username' = '',
'password' = '',
'database-name' = 'apitest',
'server-time-zone' = 'Asia/Shanghai',
'table-name' = 'products'
);
drop table if exists storage_info;
CREATE TABLE storage_info (
id INT NOT NULL,
product_id INT,
`num` INT,
PRIMARY KEY (`id`) NOT ENFORCED
) WITH (
'connector' = 'mysql-cdc',
'hostname' = '',
'port' = '3306',
'username' = '',
'password' = '',
'database-name' = 'apitest',
'server-time-zone' = 'Asia/Shanghai',
'table-name' = 'storage_info'
);
drop table if exists product_storage;
CREATE TABLE product_storage (
product_id INT,
product_name STRING,
remain_count INT,
create_time TIMESTAMP,
PRIMARY KEY (`product_id`) NOT ENFORCED
) WITH (
'connector' = 'jdbc',
'url' = 'jdbc:mysql://IP:3306/alipay?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC',
'username' = '',
'password' = '',
'table-name' = 'product_storage',
'driver' = 'com.mysql.cj.jdbc.Driver',
'scan.fetch-size' = '200'
);
INSERT INTO product_storage
SELECT a.id AS product_id,a.name AS product_name,b.num AS remain_count,a.create_time
FROM products as a
join storage_info as b on a.id=b.product_id;
检查网络 telnet IP 3306
./bin/sql-client.sh -f ./bin/flink_sql/flinkSql_007.sql
启动任务
./bin/sql-client.sh -f ./bin/flink_sql/flinkSql_007.sql
关闭任务
进入 flink web 端