【问题标题】:Kafka Connect Schema evolution when columns are removed删除列时的 Kafka Connect Schema 演变
【发布时间】:2019-11-26 01:29:46
【问题描述】:

假设我们有如下设置。

模式演化兼容性设置为 BACKWARD。

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

按照我的理解顺势而为。

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

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

  1. 下次 JDBC Source 轮询 DB 时,发现架构已更改,生成新的 Schema V2 (col1,col2) 并且寄存器 V2 是 Schema Registry。
  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]

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

【问题讨论】:

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


    【解决方案1】:

    注册表仅在注册新架构时进行验证。

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

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

    顺便说一句:仅仅因为注册表认为它是倒退的,并不能保证接收器连接器确实......源代码中的验证是不同的,而且我们遇到了多个问题:/

    【讨论】:

    • 这是否意味着如果兼容性设置为FORWARD,并且在记录中添加了一个新列。 hdfs sink 连接器继续将记录写入 hdfs 而没有新列值到 hdfs avro 文件 ???已为此创建了一份关于 kafka 连接 hdfs 的报告:github.com/confluentinc/kafka-connect-hdfs/issues/470,如果能获得更多关于此案例的意见,那就太好了。
    • @kaushikHS 建议在存储连接器中保持向后兼容性,因为您将始终查询过去的数据。此外,无论如何添加一个新的(可选)字段是一种向后兼容的更改
    猜你喜欢
    • 2021-01-11
    • 2019-06-29
    • 2019-11-16
    • 2018-08-03
    • 2022-11-18
    • 2021-11-04
    • 2021-07-01
    • 2020-10-22
    • 2018-10-11
    相关资源
    最近更新 更多