Flink CDC里所以确定是上下游schema一致吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Flink CDC中,上下游Schema的一致性并不是绝对的,而是取决于具体的配置和下游系统的支持能力。以下是对上下游Schema一致性的详细分析:
在Flink CDC作业中,Schema的同步分为两个阶段: - 全量阶段:在作业启动时,Flink CDC会通过SELECT
语句读取全量数据,并记录Binlog位点。此时,Schema是固定的,基于作业启动时的表结构。 - 增量阶段:从Binlog中读取增量数据时,Flink CDC支持实时同步表结构变更(如添加列、删除列、重命名列等),但具体行为取决于下游系统的支持能力和配置。
重要提醒:如果在全量阶段发生Schema变更(如新增列),可能会导致作业失败(如抛出NullPointerException
)。解决方法是停止作业并删除下游表后,以无状态方式重新启动作业。
不同的下游系统对Schema变更的支持能力不同,这直接影响了上下游Schema的一致性: - 支持Schema变更的系统(如Kafka): - 添加列:会在当前Schema末尾添加对应的列,并同步新增列的数据。 - 删除列:不会直接删除列,而是将该列的数据填充为NULL
。 - 重命名列:被看作添加列和删除列,在Schema末尾添加新列,并将原列数据填充为NULL
。 - 列类型变更:对于支持列类型变更的下游系统(如Kafka),可以同步列类型变更;但对于不支持列类型变更的系统(如Hologres),需要使用宽类型映射策略。
LENIENT
或EVOLVE
),并在下游建立更宽泛的表结构以兼容可能的Schema变更。Flink CDC提供了多种Schema变更行为配置,用户可以根据需求选择适合的模式: - LENIENT模式(默认): - 不发送Drop table
和Truncate table
变更。 - 列重命名时,改为发送更改列类型和新增列两个事件,原有列不删除,新增列为nullable
。 - 删除列时,改为发送更改列类型事件,将对应字段类型变为nullable
。 - 新增列时,字段类型会变为nullable
。
EVOLVE模式:
EXCEPTION模式:
通过CREATE TABLE AS
(CTAS)语句,可以在实时同步数据的同时同步表结构变更。但需要注意以下限制: - 对于不支持列类型变更的下游系统(如Hologres),CTAS无法支持列类型变更,需使用宽容模式同步。 - 暂不支持同步以下Schema变更: - 主键或索引等约束的变更。 - 非空列的删除。 - 从NOT NULL
转为NULLABLE
的变更。
重要提醒:如果遇到不支持的Schema变更,需要手动删除下游结果表并重新启动CTAS作业。
LENIENT
或EVOLVE
)。通过以上配置和注意事项,可以最大程度地保证上下游Schema的一致性,同时避免因Schema变更导致的作业失败。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。