我使用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?
答案 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 测试过了,它对我有用
curl -X DELETE http://localhost:8081/subjects/Kafka-value
curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/1
curl -X DELETE http://localhost:8081/subjects/Kafka-value/versions/latest
参考:https://docs.confluent.io/platform/current/schema-registry/schema-deletion-guidelines.html