Flink CDC中mysql cdc2.3 维表join丢数据,大家有遇到过吗?也没错误日志,这种情况怎么排查?偶尔丢一条,过几天又丢一条
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC 2.3进行MySQL维表JOIN时,如果出现数据丢失且没有错误日志的情况,可能是由以下几个原因导致的。以下是详细的排查步骤和解决方案:
如果作业中存在乱序的数据,可能会导致部分数据被丢弃。例如,迟到的数据(Watermark不在窗口范围内)会被系统认为是无效数据而丢弃。
Print Sink
或Log4j
方式确认数据源中是否存在乱序数据。Watermark
生成策略。例如:
Watermark = Event time - 5s
这样可以延迟触发窗口计算,确保乱序数据能够被正确处理。
维表的缓存策略可能会影响JOIN结果。如果使用了LRU
或ALL
缓存策略,但缓存未命中或缓存过期,可能导致部分数据无法JOIN上。
cacheTTLMs
(缓存失效时间)是否设置得过短,导致缓存频繁刷新。ALL
策略,检查内存是否足够,防止因内存不足导致缓存加载失败。LRU
和TTL
来实现较新的缓存数据。CACHE ALL
时,内存大小应为远程表数据量的两倍。如果JOIN条件中未包含维表中具有唯一性的字段,可能导致部分数据无法匹配。
MySQL CDC源表在全量阶段结束后切换到增量阶段,如果Binlog的TTL过短,可能导致部分历史数据无法被消费。
initial
,并确认全量阶段是否成功完成。tm
日志中排查是否有BinlogSplitReader is created
日志,判断是否读取完了全量数据。如果LookupJoin操作中引入了状态算子,但状态未正确维护,可能导致部分数据丢失。
table.optimizer.non-deterministic-update.strategy='TRY_RESOLVE'
优化选项。在异步模式下,如果输入流为更新流且未启用table.exec.async-lookup.key-ordered-enabled
参数,可能导致数据处理顺序混乱。
table.exec.async-lookup.output-mode=ALLOW_UNORDERED
。table.exec.async-lookup.key-ordered-enabled
参数,确保相同更新键的消息按照进入算子的顺序处理。TimeOut
类报错。状态总览
页面查看Source端是否发送数据,Sink端是否接收数据,定位问题发生位置。针对上述问题,建议按以下步骤逐步排查: 1. 检查是否存在数据乱序,并调整Watermark
策略。 2. 确认维表缓存策略是否合理,并调整缓存配置。 3. 检查JOIN条件是否正确,确保包含维表中具有唯一性的字段。 4. 确认MySQL CDC源表的Binlog TTL是否足够长,必要时升级到全增量一体消费版本。 5. 检查LookupJoin算子的状态维护是否正确。 6. 启用table.exec.async-lookup.key-ordered-enabled
参数,确保异步I/O的顺序性。
如果以上方法仍无法解决问题,建议联系阿里云技术支持团队,提供详细的作业日志和配置信息以便进一步分析。