Flink sql cdc执行过程

最近使用flink sql cdc实现实时报表,cdc是基于debezium实现的全量和增量数据读取。根据flink sql cdc源码和日志输出可以看到其执行过程,过程包括以下10个步骤:

  1. 禁止mysql自动提交、开启可重复读事务、并且设置锁和锁的超时时间(disabling autocommit, enabling repeatable read transactions, and setting lock wait timeout to 10);
  2. 执行flush table,以防止写入数据库,如果无法刷新并获取全局读取锁,读取表名后将使用表读取锁(flush and obtain global read lock to prevent writes to database);
  3. 开启一致性快照事务(start transaction with consistent snapshot);
  4. 从mysql master 的binlog获取position( read binlog position of MySQL master);
  5. 读取可用数据库读列表(read list of available databases);
  6. 读取每一个数据库下可用的table(read list of available tables in each database);
  7. 生成drop和create statements映射当前数据库schemas(generating DROP and CREATE statements to reflect current database schemas);
  8. 释放全局读锁,让mysql恢复可写;
  9. 当事务仍然在处理时,继续扫描表,这个时候会去扫描作业中涉及的表,在这一步会去扫描完成所有的表(scanning contents of 1 tables while still in transaction);
  10. 提交事务(committing transaction);

 

根据提供的引用内容,可以得知问题出现在将数据库操作代码放入`addSink`方法中时会报错。因此,我们需要将数据库操作代码放入`addSink`方法中,并使用`JdbcSinkFunction`类进行入库操作。以下是连接GaussDB并使用Flink SQL CDC进行数据同步的步骤: 1.首先,需要在Flink中添加GaussDB的JDBC驱动程序。可以将驱动程序jar包放入Flink的lib目录中,或者在启动Flink Job时使用`--classpath`参数指定驱动程序jar包的路径。 2.在Flink SQL Client中创建一个表,用于存储CDC数据。例如,可以使用以下命令创建一个名为`my_table`的表: ```sql CREATE TABLE my_table ( id INT, name STRING, age INT ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:postgresql://localhost:5432/mydb', 'table-name' = 'my_table', 'username' = 'myuser', 'password' = 'mypassword', 'sink.buffer-flush.max-rows' = '5000' ) ``` 其中,`connector`参数指定使用JDBC连接器,`url`参数指定GaussDB的连接URL,`table-name`参数指定表名,`username`和`password`参数指定连接数据库的用户名和密码,`sink.buffer-flush.max-rows`参数指定缓冲区大小。 3.在Flink SQL Client中创建一个CDC源表,用于捕获GaussDB中的变更数据。例如,可以使用以下命令创建一个名为`my_source`的CDC源表: ```sql CREATE TABLE my_source ( id INT, name STRING, age INT, ts TIMESTAMP(3), watermark FOR ts AS ts - INTERVAL '5' SECOND ) WITH ( 'connector' = 'postgresql-cdc', 'hostname' = 'localhost', 'port' = '5432', 'username' = 'myuser', 'password' = 'mypassword', 'database-name' = 'mydb', 'schema-name' = 'public', 'table-name' = 'my_table' ) ``` 其中,`connector`参数指定使用PostgreSQL CDC连接器,`hostname`和`port`参数指定GaussDB的主机名和端口号,`username`和`password`参数指定连接数据库的用户名和密码,`database-name`参数指定数据库名,`schema-name`参数指定模式名,`table-name`参数指定表名。 4.在Flink SQL Client中创建一个查询,用于将CDC源表中的数据写入目标表。例如,可以使用以下命令创建一个查询: ```sql INSERT INTO my_table SELECT id, name, age FROM my_source ``` 5.在Flink中编写一个Job,将上述查询转换为Flink Job。例如,可以使用以下代码编写一个Job: ```java StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env); tEnv.executeSql("CREATE TABLE my_table (id INT, name STRING, age INT) WITH (...)"); tEnv.executeSql("CREATE TABLE my_source (id INT, name STRING, age INT, ts TIMESTAMP(3), watermark FOR ts AS ts - INTERVAL '5' SECOND) WITH (...)"); tEnv.executeSql("INSERT INTO my_table SELECT id, name, age FROM my_source"); env.execute(); ``` 其中,`StreamExecutionEnvironment`和`StreamTableEnvironment`分别用于创建Flink执行环境和Flink Table环境,`executeSql`方法用于执行SQL语句,`env.execute()`方法用于启动Flink Job。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值