开发者社区 > 大数据与机器学习 > 实时计算 Flink > 正文

insert into sink_kafka_table select from source_my

insert into sink_kafka_table select from source_mysql_table checkpoint生效,'scan.startup.mode'='initial',会出现重复记录,即所有表记录再同步一份到kafka 请问还要设置哪里呢?

展开
收起
十一0204 2023-04-05 09:05:27 153 0
1 条回答
写回答
取消 提交回答
  • 随心分享,欢迎友善交流讨论:)

    出现重复数据的原因可能是由于 select from source_mysql_table 查询语句中未指定合适的 WHERE 条件或者 checkpoint 没有生效,导致数据重复写入到 sink_kafka_table 中。针对这个问题,您可以尝试以下几个方案:

    在 select 语句中指定合适的 WHERE 条件,避免重复数据的写入。例如:

    insert into sink_kafka_table select * from source_mysql_table where id > checkpoint; 其中,checkpoint 是被记录下来的最后一次同步的位置,可以通过查询 sink_kafka_table 表的 offset 字段获取。

    确认 checkpoint 配置生效,可以通过查看 binlog 的位置信息以及 sink_kafka_table 表的 offset 字段确认是否生效。

    将 scan.startup.mode 设置为 earliest-offset,强制从最早的 offset 位置开始同步数据。这样会将所有的数据都同步至 sink_kafka_table 中,但是也会增加同步的数据量。

    { "name": "mysql-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "localhost", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "database.server.name": "dbserver1", "database.whitelist": "inventory", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "dbhistory.inventory", "include.schema.changes": "true", "scan.startup.mode": "earliest-offset" } } 注意:这个选项会在启动时把所有数据都同步,如果数据量非常大的话,可能会导致 Kafka 集群的负载过高。

    如果以上方案都无法解决问题,您可以考虑在 sink_kafka_table 表中添加唯一约束,避免数据重复写入。例如:

    alter table sink_kafka_table add constraint uk_sink_kafka_table unique (id); 其中,id 是主键或唯一索引字段,您可以根据实际情况进行调整。

    2023-04-18 18:03:30
    赞同 展开评论 打赏

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

相关电子书

更多
Java Spring Boot开发实战系列课程【第16讲】:Spring Boot 2.0 实战Apache Kafka百万级高并发消息中间件与原理解析 立即下载
MaxCompute技术公开课第四季 之 如何将Kafka数据同步至MaxCompute 立即下载
消息队列kafka介绍 立即下载