Flink CDC 实现Postgres到MySQL流式加工传输案例

案例:实现文章的访问量统计

使用Flink Postgres CDC 进行数据输入,在 Flink SQL CLI 中进行逻辑加工,整个过程使用 SQL ,无需代码。将结果通过JDBC方式输出到MySQL。

1 数据库表准备

postgres数据库环境配置参考文章:Flink PostgreSQL CDC配置和常见问题

-- postgresql
-- 文章记录表
CREATE TABLE t_article (
  id SERIAL NOT NULL PRIMARY KEY,
  title VARCHAR(100) NOT NULL,
  contents VARCHAR(500) NOT NULL,
  author VARCHAR(20) NOT NULL,
  create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
ALTER SEQUENCE public.t_article_id_seq RESTART WITH 1001;
ALTER TABLE public.t_article REPLICA IDENTITY FULL;
-- 初始化数据
INSERT INTO t_article (title,contents,author)
VALUES ('华尔街日报回怼马斯克','知情人士揭露马斯克和谷歌联合创始人谢尔盖·布林之间长达20年的友谊突...','每日邮报'),
       ('跨省异地就医新规出台','国家医保局、财政部26日发布《关于进一步做好基本医疗保险跨省异地就医直接结算工作的通知》','新华社客户端'),
       ('扎实推动共同富裕','让人民过上好日子,是“国之大者”。深刻践行以人民为中心的发展思想,既要尽力而为也要量力而行,我们在高质量发展中促进共同富裕的脚步更加笃定。','中国经济网');

-- 文章访问记录表       
CREATE TABLE t_article_visit  (
	id SERIAL NOT NULL PRIMARY KEY,
  article_id int4 NOT NULL,
  visitor VARCHAR(100) NOT NULL,
  visitor_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
); 
ALTER TABLE public.t_article REPLICA IDENTITY FULL; 
-- 初始化数据
INSERT INTO  "t_article_visit"( "article_id", "visitor") VALUES (1001, 'zhangsan');
INSERT INTO  "t_article_visit"( "article_id", "visitor") VALUES (1001, 'lisi');

-- mysql
CREATE TABLE f_article_visit_count (
  article_id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
  article_title VARCHAR(255)  NOT NULL,
  visitor_count bigint  DEFAULT 0
);

2 安装flink以及依赖jar

下面以本地模式安装,提前安装好 Java 8 或者 Java 11

flink版本使用 1.13.6 ,下载后并解压。
$ tar -xzf flink-1.13.6-bin-scala_2.11.tgz
$ cd flink-1.13.6

目录结构:
在这里插入图片描述

启动与停止命令
$ ./bin/start-cluster.sh
$ ./bin/stop-cluster.sh
下载cdc依赖jar

下载地址
在这里插入图片描述
本案例使用 postgres作为数据输入,下载 flink-sql-connector-postgres-cdc-2.2.1.jar 即可

下载JDBC Connectors

下载地址
注意:也需要额外下载相关数据库的驱动。

将下载好的依赖包放置到 /lib 目录下

  • flink-sql-connector-postgres-cdc-2.2.1.jar
  • flink-connector-jdbc_2.11-1.13.6.jar
  • mysql-connector-java-8.0.28.jar

3.使用flink sql 客户端编写加工逻辑

启动sql客户端
./bin/sql-client.sh 

flink sql-client启动界面

创建Postgres CDC连接和Mysql JDBC连接
-- 设置检查点
 SET execution.checkpointing.interval = 3s;
 CREATE TABLE t_article (
   	id INT,
	title STRING,
	contents STRING,
	author STRING,
	create_time TIMESTAMP(0),
   PRIMARY KEY (id) NOT ENFORCED
 ) WITH (
   'connector' = 'postgres-cdc',
   'hostname' = '10.10.1.74',
   'port' = '5432',
   'username' = 'postgres',
   'password' = '123456',
   'database-name' = 'test',
   'schema-name' = 'public',
   'table-name' = 't_article',
   'decoding.plugin.name' = 'pgoutput',
   'debezium.slot.name' = 'flink_t_article'
 );
  CREATE TABLE t_article_visit (
	id INT,
   	article_id INT,
	visitor STRING,
	visitor_time TIMESTAMP(0),
    PRIMARY KEY (id) NOT ENFORCED
 ) WITH (
   'connector' = 'postgres-cdc',
   'hostname' = '10.10.1.74',
   'port' = '5432',
   'username' = 'postgres',
   'password' = '123456',
   'database-name' = 'test',
   'schema-name' = 'public',
   'table-name' = 't_article_visit',
   'decoding.plugin.name' = 'pgoutput',
   'debezium.slot.name' = 'flink_t_article_visit'
 );
 CREATE TABLE f_article_visit_count (
   	article_id INT,
	article_title STRING,
	visitor_count  BIGINT,
    PRIMARY KEY (article_id) NOT ENFORCED
 ) WITH ('connector' = 'jdbc',
    'url' = 'jdbc:mysql://10.10.1.72:3306/test',
    'username' = 'root',
    'password' = '123456',
    'table-name' = 'f_article_visit_count'
 );

在客户端查看创建的逻辑表
查看flink表

执行加工任务
INSERT INTO f_article_visit_count SELECT
art.id article_id,
art.title article_title,
count( artv.id ) visitor_count 
FROM t_article art
INNER JOIN t_article_visit artv ON art.id = artv.article_id 
GROUP BY art.id,art.title;
控制台查看任务

flink 控制台页面

查看数据

任务发布后,表f_article_visit_count 的初始数据
初始加工数据
通过向postgres库中表t_article_visit插入记录,观察mysql库中表f_article_visit_count数据实时变化

INSERT INTO  "t_article_visit"( "article_id", "visitor") VALUES (1001, 'wangwu');
INSERT INTO  "t_article_visit"( "article_id", "visitor") VALUES (1002, 'libai');

在这里插入图片描述

Flink CDC 2.0 是一种流式数据同步工具,可以用于将数据库中的数据实时同步到其他数据源中。整库同步是一种将整个数据库的数据同步到其他数据源中的方式,下面是一些实现整库同步的代码示例: 1. 使用 Flink CDC 2.0 进行 MySQL 数据库整库同步的示例代码: ```java public class MySQLCDCJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); Properties props = new Properties(); props.setProperty("connector.property-version", "1"); props.setProperty("connector.type", "mysql-cdc"); props.setProperty("connector.startup-mode", "initial"); props.setProperty("connector.username", "root"); props.setProperty("connector.password", "123456"); props.setProperty("connector.hostname", "localhost"); props.setProperty("connector.port", "3306"); props.setProperty("connector.database", "test"); props.setProperty("connector.table.whitelist", ".*"); props.setProperty("connector.table.ignore-patterns", "^test\\..*"); props.setProperty("format.type", "debezium-json"); DataStream<String> stream = env .addSource(new FlinkCDCSource.Builder<String>() .setProperties(props) .build()) .map(new MapFunction<RowData, String>() { @Override public String map(RowData value) throws Exception { return value.toString(); } }); stream.print(); env.execute("MySQL CDC Job"); } } ``` 2. 使用 Flink CDC 2.0 进行 PostgreSQL 数据库整库同步的示例代码: ```java public class PostgresCDCJob { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); Properties props = new Properties(); props.setProperty("connector.property-version", "1"); props.setProperty("connector.type", "postgres-cdc"); props.setProperty("connector.startup-mode", "initial"); props.setProperty("connector.username", "postgres"); props.setProperty("connector.password", "123456"); props.setProperty("connector.hostname", "localhost"); props.setProperty("connector.port", "5432"); props.setProperty("connector.database", "test"); props.setProperty("connector.schema.whitelist", "public"); props.setProperty("connector.table.whitelist", ".*"); props.setProperty("connector.table.ignore-patterns", "^test\\..*"); props.setProperty("format.type", "debezium-json"); DataStream<String> stream = env .addSource(new FlinkCDCSource.Builder<String>() .setProperties(props) .build()) .map(new MapFunction<RowData, String>() { @Override public String map(RowData value) throws Exception { return value.toString(); } }); stream.print(); env.execute("PostgreSQL CDC Job"); } } ``` 以上代码示例使用 Flink CDC 2.0 的 `FlinkCDCSource` 类和相应的连接器配置来创建了一个流数据源。使用 `map` 函数将数据转换为字符串并打印输出。可以根据实际需求修改连接器配置,实现不同的数据同步功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值