FlinkCDC读取MySQL,并行度高于1就无法捕获更新数据,并且给fromSource单独设置并行度也未能成功捕获更新数据。
private SingleOutputStreamOperator<TableProcess> readConfig(StreamExecutionEnvironment env) {
MySqlSource<String> mySqlSource = MySqlSource.<String>builder()
.hostname("Master")
.port(3306)
.databaseList("xxx") // set captured database
.tableList("xxx.aaa") // set captured table
.username("root")
.password("xxxxxx")
.deserializer(new JsonDebeziumDeserializationSchema()) // converts SourceRecord to JSON String
.build();
return env
.fromSource(
mySqlSource,
WatermarkStrategy.noWatermarks(),
"Mysql Source")
.setParallelism(1)
.map(json -> {
JSONObject jsonObj = JSON.parseObject(json);
return jsonObj.getObject("after", TableProcess.class);
});
}
这段代码单独拿出来,env并行度设置为1是可以捕获更新数据的。
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-java</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.12</artifactId>
<version>1.13.0</version>
</dependency>
<dependency>
<groupId>com.ververica</groupId>
<artifactId>flink-connector-mysql-cdc</artifactId>
<version>2.1.0</version>
</dependency>
求助大佬。
出现这个问题的原因是,FlinkCDC 默认使用单线程来处理数据,当并行度高于 1 时,就会创建多个线程来处理数据,每个线程会从 MySQL 中接收到不同的数据,导致数据重复。
解决这个问题的方法是,修改 FlinkCDC 的配置,设置 parallelism.max 的值为 1。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。