Kafka模式注册表在同一主题中不兼容

时间:2018-04-12 15:57:11

标签: apache apache-kafka avro

我使用Kafka模式注册表来生成/使用Kafka消息,例如我有两个字段,它们都是字符串类型,伪模式如下:

{"name": "test1", "type": "string"}
{"name": "test2", "type": "string"}

但是在发送并消耗了一段时间之后,我需要修改模式以将第二个字段更改为long类型,然后它抛出以下异常:

Schema being registered is incompatible with an earlier schema; error code: 409

我很困惑,如果架构注册表无法进化架构升级/更改,那么我为什么要使用Schema注册表,或者说我为什么使用Avro?

4 个答案:

答案 0 :(得分:8)

有一个已知的错误(问题#518),目前在汇合的github repo中打开。作为解决方法,您可以更改架构注册表的兼容性规则。

根据docs

  

架构注册表服务器可以强制执行某些兼容性规则   当新模式在主题中注册时。目前,我们支持   以下兼容性规则。

     

向后兼容性(默认):新架构向后兼容   如果它可以用于读取所有以前的模式中写入的数据。   向后兼容性对于将数据加载到系统中非常有用   Hadoop因为总是可以使用。来查询所有版本的数据   最新架构。

     

向前兼容性:新架构正在推进   如果所有先前的模式都可以读取在此写入的数据,则兼容   架构。向前兼容性对于消费者应用程序很有用   只能处理特定版本中可能并非总是如此的数据   最新版本。

     

完全兼容性:完全符合新架构   兼容,如果它是向后兼容的。

     

无兼容性:新架构可以是任何架构,只要它是有效的   阿夫罗。

compatibility设置为NONE应该可以解决问题。

# Update compatibility requirements globally
$ curl -X PUT -H "Content-Type: application/vnd.schemaregistry.v1+json" \
    --data '{"compatibility": "NONE"}' \
    http://localhost:8081/config

响应应该是

  {"compatibility":"NONE"}

答案 1 :(得分:2)

您可以像这样简单地附加一个默认值。

tf.gather(X, Y, axis = 1)

答案 2 :(得分:1)

https://docs.confluent.io/current/avro.html 您可能需要添加一个“默认”:null。

答案 3 :(得分:0)

如果您只需要新架构而不需要架构注册表中以前的架构,您可以删除旧架构,如下所述 :

我已经用 confluent-kafka 测试过了,它对我有用

删除在主题“Kafka-value”下注册的所有模式版本

curl -X DELETE http://localhost:8081/subjects/Kafka-value

删除在主题“Kafka-value”下注册的模式的版本 1

curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/1

删除主题“Kafka-value”下最近注册的模式

curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/latest

参考:https://docs.confluent.io/platform/current/schema-registry/schema-deletion-guidelines.html