Flink CDC我在代码中设置的是这样的,但是它在我的日志中又是另外一种体现,它究竟是怎么变成这样的呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在使用Flink CDC时,代码中设置的逻辑与日志中的实际体现可能存在差异,这通常是由以下几个原因导致的。以下是详细分析和可能的原因解释:
Flink CDC 是一个基于 Flink 的流式 ETL 数据摄取框架,其核心功能是捕获数据库的变更数据(如插入、更新、删除操作),并将其转换为 Flink 可处理的流式数据。在这个过程中,Flink CDC 会对原始数据进行一系列标准化和优化处理,可能导致日志输出与代码设置不一致。
+I 表示插入,-U 表示更新前镜像,+U 表示更新后镜像,-D 表示删除)。这种格式是为了支持 Flink 的流式计算模型。Flink CDC 的日志输出主要来源于以下两个方面: - 框架内部日志:Flink CDC 框架本身会在运行时记录详细的日志信息,包括捕获的变更事件、连接器状态、Checkpoint 等。这些日志可能包含比代码中设置的更多信息。 - 用户自定义日志:如果您在代码中通过 Logging 输出了日志信息(例如使用 logging.info),这些日志会与框架日志混合在一起,可能导致日志内容看起来与代码设置不一致。
以下是可能导致代码设置与日志体现不一致的具体原因:
Flink CDC 内部会对变更日志进行标准化处理,以确保数据的一致性和准确性。例如: - 如果您在代码中设置了主键语义(如 PRIMARY KEY),Flink CDC 会自动引入 ChangelogNormalize 算子对变更日志进行去重和规范化处理。 - 这种处理可能会导致日志中出现额外的变更事件(如重复的 -U 或 +U),即使这些事件在代码中并未显式定义。
如果启用了增量快照功能(Incremental Snapshot),Flink CDC 会在全量同步阶段创建多个临时的 Replication Slot,并记录全量数据的变更日志。这可能导致日志中出现额外的变更事件。
Flink 的日志输出受日志级别和配置文件的影响。如果日志级别设置为 DEBUG 或 TRACE,Flink CDC 会记录更详细的内部信息,包括框架的中间状态和处理细节。这可能导致日志内容比代码设置更加复杂。
不同的 CDC 连接器(如 MySQL CDC、Postgres CDC、MongoDB CDC)可能有不同的默认行为。例如: - MongoDB CDC 在捕获变更事件时,会根据 Resume Token 记录变更位置,并在日志中输出相关的元数据信息。 - Postgres CDC 在逻辑复制过程中,会记录 WAL(Write-Ahead Logging)中的变更信息,这些信息可能与代码设置的字段不完全一致。
为了确认日志内容的具体来源,您可以按照以下步骤进行排查:
INFO 或更高。如果日志级别为 DEBUG 或 TRACE,可以尝试调整为 INFO,以减少不必要的日志输出。ChangelogNormalize 或 SinkUpsertMaterializer 等关键字,说明日志内容是由 Flink CDC 框架生成的。scan.full-changelog 或 table.exec.source.cdc-events-duplicate)。task.cancellation.timeout 参数设置为 0,以便在作业退出时捕获更多调试信息。如果您需要进一步的帮助,请提供具体的代码片段和日志内容,以便更准确地分析问题。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。