删除列时的 Kafka Connect Schema 演变
Kafka Connect Schema evolution when columns are removed
假设我们有如下设置。
架构演变兼容性设置为 BACKWARD。
JDBC Source Connector 从 DB 轮询数据写入 Kafka topic.HDFS Sink Connector 从 Kafka 主题读取消息并以 Avro 格式写入 HDFS。
按照我理解的流程进行。
- JDBC 源连接器查询数据库并从 JDBC ResultSet 的元数据生成架构 V1。V1 具有 col1,col2,col3.Schema V1 已在架构注册表中注册。
- 源连接器从 DB 轮询数据并将消息写入 V1 架构中的 Kafka 主题。
- (问题 1) 当 HDFS Sink 连接器从主题中读取消息时,它是否根据模式注册表中的 V1 模式验证消息?
下一个数据库架构已更改。 "col3" 列已从 table 中删除。
- 下次JDBC 源轮询 DB 发现模式已更改,生成新的模式 V2 (col1,col2) 并将 V2 注册为模式注册表。
- Source Connect 继续轮询数据并写入 V2 架构中的 Kafka 主题。
- 现在 Kafka 主题可以在 V1 和 V2 架构中包含消息。
- (问题 2)当 HDFS Sink 连接器读取消息时,它现在是否根据 Schema V2 验证消息?
Confluent 文档在向后兼容性下解决了这个问题? :
[https://docs.confluent.io/current/schema-registry/avro.html#schema-evolution-and-compatibility]
An example of a backward compatible change is a removal of a field. A
consumer that was developed to process events without this field will
be able to process events written with the old schema and contain the
field – the consumer will just ignore that field.
注册表仅在注册新模式时验证。
因此,if/when 源连接器检测到更改,然后在注册表端进行验证
至于 HDFS 连接器,有一个单独的 schema.compatibility 属性 可以对内存中保存的记录和任何新记录应用投影。当您获得具有新模式的记录并进行向后兼容更新时,所有尚未刷新的消息都将更新以在写入 Avro 容器文件时保留新模式。
旁白:仅仅因为注册表认为它是倒退的,并不能保证接收器连接器确实...源代码中的验证是不同的,我们遇到了多个问题:/
假设我们有如下设置。
JDBC Source Connector 从 DB 轮询数据写入 Kafka topic.HDFS Sink Connector 从 Kafka 主题读取消息并以 Avro 格式写入 HDFS。
按照我理解的流程进行。
- JDBC 源连接器查询数据库并从 JDBC ResultSet 的元数据生成架构 V1。V1 具有 col1,col2,col3.Schema V1 已在架构注册表中注册。
- 源连接器从 DB 轮询数据并将消息写入 V1 架构中的 Kafka 主题。
- (问题 1) 当 HDFS Sink 连接器从主题中读取消息时,它是否根据模式注册表中的 V1 模式验证消息?
下一个数据库架构已更改。 "col3" 列已从 table 中删除。
- 下次JDBC 源轮询 DB 发现模式已更改,生成新的模式 V2 (col1,col2) 并将 V2 注册为模式注册表。
- Source Connect 继续轮询数据并写入 V2 架构中的 Kafka 主题。
- 现在 Kafka 主题可以在 V1 和 V2 架构中包含消息。
- (问题 2)当 HDFS Sink 连接器读取消息时,它现在是否根据 Schema V2 验证消息?
Confluent 文档在向后兼容性下解决了这个问题? : [https://docs.confluent.io/current/schema-registry/avro.html#schema-evolution-and-compatibility]
An example of a backward compatible change is a removal of a field. A consumer that was developed to process events without this field will be able to process events written with the old schema and contain the field – the consumer will just ignore that field.
注册表仅在注册新模式时验证。
因此,if/when 源连接器检测到更改,然后在注册表端进行验证
至于 HDFS 连接器,有一个单独的 schema.compatibility 属性 可以对内存中保存的记录和任何新记录应用投影。当您获得具有新模式的记录并进行向后兼容更新时,所有尚未刷新的消息都将更新以在写入 Avro 容器文件时保留新模式。
旁白:仅仅因为注册表认为它是倒退的,并不能保证接收器连接器确实...源代码中的验证是不同的,我们遇到了多个问题:/