删除列时的Kafka Connect Schema演变

时间:2019-07-17 08:52:43

标签: apache-kafka apache-kafka-connect confluent confluent-schema-registry

让我们说一下我们的设置如下。

enter image description here 模式演化兼容性设置为BACKWARD。

JDBC Source Connector轮询从DB写入Kafka主题的数据。HDFSSink Connector从Kafka主题读取消息并以Avro格式写入HDFS。

按照我所了解的流程。

  1. JDBC Source Connector查询数据库并从ResultSet中的JDBC元数据生成SchemaV1。V1具有col1,col2,col3。SchemaV1已在Schema Registry中注册。
  2. 源连接器轮询数据库中的数据,并将消息写入V1模式中的Kafka主题。
  3. 问题1 ),当HDFS Sink连接器从该主题读取消息时,它是否根据Schema Registry中的V1模式验证了这些消息?

下一个数据库模式已更改。列“ col3”已从表中删除。

  1. 下一次JDBC Source轮询数据库时,它会看到模式已更改,生成新的模式V2(col1,col2),并且寄存器V2是模式注册表。
  2. Source Connect继续轮询数据,并在V2架构中写入Kafka主题。
  3. 现在,“ Kafka主题”可以同时具有V1和V2模式的消息。
  4. 问题2 )现在,当HDFS Sink连接器读取消息时,它是否根据Schema V2验证消息?

这种情况在Confluent文档的“向后兼容性”下得到了解决? : [https://docs.confluent.io/current/schema-registry/avro.html#schema-evolution-and-compatibility]

  

向后兼容更改的一个示例是删除字段。一种   被开发来处理没有此字段的事件的消费者将   能够处理使用旧模式编写的事件并包含   字段–消费者只会忽略该字段。

1 个答案:

答案 0 :(得分:1)

仅当注册新架构时,注册表才会生效。

因此,如果/当源连接器检测到更改时,则在注册表端进行验证

对于HDFS连接器,有一个单独的schema.compatibility属性,该属性将投影应用于内存中保存的记录和所有新记录。当您获得具有新架构的记录并进行向后兼容更新时,在写入Avro容器文件时,所有尚未刷新的消息都将更新为保存新架构。

此外:仅仅因为注册表认为它是向后的,并不保证接收器连接器确实可以...源代码中的验证是不同的,并且我们遇到了很多问题:/