Flink 中文社区 | 中文学习教程Flink 中文社区是 Apache Flink 唯一授权的学习网站
https://flink-learning.org.cn/article/detail/3ebe9f20774991c4d5eeb75a141d9e1e问题及测试集锦
1、flink cdc 的 api兼容的ddl的结构变更吗?
2、cdc 比如增量消费 然后 kill任务 再恢复?
3、mysql cdc 设置了检查点,sink到kafka,重启作业,为啥全量的数据还是会重新发送到kafka
4、CDC 到 KAFKA 时无法按照主键进行自动分区分发、无法指定分区键分发数据。到 KAFKA 的数据格式指定(JSON,AVRO JSON等)。
5、chanage-json format
测试3:chanage-json format 测试。
订单:
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
// 如果本该不为null的,出现了null ,是因为数据是以流进入,首次进入的没有关联上,所以为null,为null剔除即可
tableEnv.getConfig().getConfiguration().setString("table.exec.sink.not-null-enforcer","drop");
//order
tableEnv.executeSql("" +
"create table db_order_info(" +
" id bigint not null " + // id
" ,consignee string " + //-- 名称
" ,total_amount decimal(10) " + //-- 金额
" ,user_id bigint" +
",PRIMARY KEY(id) NOT ENFORCED" +
" ) with" +
"(" +
"'connector' = 'mysql-cdc'" +
",'hostname' = 's202'" +
",'port'= '3306'" +
",'username' = 'root'" +
",'password' = '123456'" +
",'database-name' = 'gmall-flink-202111'" +
",'table-name' = 'order_info'" +
",'scan.startup.mode' = 'initial'" +
// 为了方便测试,关闭自增
",'scan.incremental.snapshot.enabled' = 'false'" +
")");
订单明细:
tableEnv.executeSql("" +
"create table db_order_detail(" +
" id bigint not null " + // id
" ,order_id bigint " +
" ,sku_id bigint " +
" ,sku_name string " +
" ,create_time string " +
",PRIMARY KEY(id) NOT ENFORCED" +
" ) with" +
"(" +
"'connector' = 'mysql-cdc'" +
",'hostname' = 's202'" +
",'port'= '3306'" +
",'username' = 'root'" +
",'password' = '123456'" +
",'database-name' = 'gmall-flink-202111'" +
",'table-name' = 'order_detail'" +
",'scan.startup.mode' = 'initial'" +
// 为了方便测试,关闭自增
",'scan.incremental.snapshot.enabled' = 'false'" +
")");
求gmv:
新建kafka 连接器并指定format='changelog-json'
tableEnv.executeSql("create table order_gmv_kafka(" +
" sku_id bigint not null " +
" ,sku_name string " +
" ,gmv decimal(10) " +
",PRIMARY KEY(sku_id) NOT ENFORCED" +
") with" +
"(" +
"'connector' = 'kafka'" +
",'topic' = 'test_chanagelog_json'" +
",'scan.startup.mode' = 'earliest-offset'" +
",'properties.bootstrap.servers' = 's201:9092,s202:9092,s203:9092'" +
",'properties.group.id' = 'test_chanagelog_json_group'" +
",'format' = 'changelog-json'" +
")");
写入到kafka:
tableEnv.executeSql("" +
"insert into order_gmv_kafka " +
"select " +
" b.sku_id" +
" ,min(b.sku_name) as sku_name" +
" ,sum(a.total_amount) as gmv" +
// " ,a.id " +
// " ,a.consignee " +
" from db_order_info a " +
" left join db_order_detail b" +
" on a.id = b.order_id" +
" group by b.sku_id").print();
//需要开启另一个消费者去观察数据
// bin/ kafka-console-consumer.sh --bootstrap-server s203:9092 --topic test_chanagelog_json --from-beginning
结果:以流的方式来计算。
现象2:flink-connector-mysql-cdc-2.0.2不支持source并发,官网不是说2.0之后的新特性么,2.1.0版本对比如下:

2.0.2 的source里面没有MysqlSource,只有MysqlParallelSource,但是这个不能作为source传入。mysql包下的MysqlSqlSource不能设置多并行度。
这个2.1.1的source下面就有了MysqlSource类。
结论:花了我两个晚上,号称不是2.0版本以后支持source 多并发的么,,只是2.0以后sql是支持了,2.0 stream api还不支持。到了2.1以后streamapi支持了。所以改了2.1之后,有了如下的参数支持多并发。

现象1:flink cdc sql模式 开启了全量checkpoint,且设置了source源多并行度,本地idea一直消费不了变更数据,且提交任务到集群中,可以消费到数据。

这个本地idea开启的,而且ck一直处于正在进行,问题大致是因为ck不成功,导致消费不了,卡住了。
提交到集群中跑就没问题。所以遇到这种问题的,不要慌,不是代码问题,应该是兼容的问题。



这是提交到集群成功的截图,消费的数据在控制台。
代码如下:
package com.cuichunchi;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.configuration.RestOptions;
import org.apache.flink.runtime.state.hashmap.HashMapStateBackend;
import org.apache.flink.streaming.api.CheckpointingMode;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
/**
* @author :CUICHUNCHI
* @date :2021/11/28
* @time : 22:08
* @description:
* @modified By:2021/11/28
* @version: 1.0
* 当为大型数据库制作初始一致快照时,您建立的连接可能会在读取表时超时。您可以通过在 MySQL 配置文件中配置 interactive_timeout 和 wait_timeout 来防止这种行为。
* interactive_timeout:服务器在关闭交互式连接之前等待其活动的秒数。请参阅MySQL 文档。
* wait_timeout:服务器在关闭非交互式连接之前等待其活动的秒数。请参阅MySQL 文档。
*/
public class FlinkcdcWithSQL {
public static void main(String[] args)throws Exception {
Configuration conf = new Configuration();
conf.setString(RestOptions.BIND_PORT,"17081");
// StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(conf);
env.disableOperatorChaining();
env.setParallelism(4);
env.enableCheckpointing(50000);
// env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE);
// env.getCheckpointConfig().setCheckpointTimeout(10000L);
// //可以存在两个ck
// env.getCheckpointConfig().setMaxConcurrentCheckpoints(2);
// //两次连续的ck之间的最小间隔
// env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000L);
// env.setStateBackend(new HashMapStateBackend());
// env.getCheckpointConfig().setCheckpointStorage("file:///E:\\ideaWorkspace\\bigDataStudy\\FlinkCDC" +
// "\\FlinkcdcWithSQL\\checkpoint");
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
tableEnv.executeSql("" +
"create table mysql_binlog(" +
" id INT not null" +
" ,tm_name STRING " +
" ,logo_url STRING" +
" ,PRIMARY KEY(id) NOT ENFORCED" + //必须加,因为默认是增量快照
" ) with (" +
" 'connector'='mysql-cdc'" +
", 'hostname' = 's202'" +
", 'port' = '3306'" +
", 'username' = 'root'" +
", 'password' = '123456'" +
", 'database-name' = 'gmall-flink-202111'" +
", 'table-name' = 'base_trademark'" +
// ", 'scan.startup.mode' = 'latest-offset'" +
", 'scan.startup.mode' = 'initial'" +
// 如果源表没有主键,则设置false
// ", 'scan.incremental.snapshot.enabled' = 'false'" +
//使用增量快照,可以并行执行,提高效率 默认true
//不设置增量的话,那么source并行度只能是1,即使设置了全局并行度,source也是为1
//查阅官网:https://ververica.github.io/flink-cdc-connectors/master/content/connectors/mysql-cdc.html
// prop.setProperty("scan.incremental.snapshot.enabled","false");
//增量快照是一种读取表快照的新机制。与旧的快照机制相比,增量快照有很多优点,
// 包括:(1)在快照读取时source可以并行,
// (2)在快照读取时source可以在chunk粒度上执行检查点,
// (3)source不需要在快照读取之前获取全局读锁(FLUSH TABLES WITH READ LOCK)。如果您希望源代码并行运行,每个并行阅读器都应该有一个唯一的服务器 ID,因此“服务器 ID”必须是一个类似于“5400-6400”的范围,并且该范围必须大于并行度。请参阅增量快照阅读部分了解更多详细信息。
", 'scan.incremental.snapshot.enabled' = 'true'" +
// //范围代表的是source的并行度,范围必须大于全局并行度,,但是运行时《=设置的全局并行度
", 'server-id' = '5400-5408'" +
// 5行划分为一个chunk
", 'scan.incremental.snapshot.chunk.size' = '5'" +
")");
Table table = tableEnv.sqlQuery("select * from mysql_binlog");
//注意:flink 2.0.0 版本中,table转为动态流的时候,更新源表数据行后,不会监听,不会打印,
// 换成2.0.2版本后,可以监听到了,打印出来
DataStream<Tuple2<Boolean, Row>> dataStream = tableEnv.toRetractStream(table, Row.class);
dataStream.print("flinkcdcwithsql");
//
// env.execute("FlinkCDC-SQL");
tableEnv.executeSql("select * from mysql_binlog").print();
}
}
290



被折叠的 条评论
为什么被折叠?



