我一直在尝试将Confluent的kafka-avro-console-consumer连接到我们的旧版Kafka集群,该集群在没有Confluent Schema Registry的情况下进行了部署。 我使用以下属性明确提供了架构:
kafka-console-consumer --bootstrap-server kafka02.internal:9092 \
--topic test \
--from-beginning \
--property key.schema='{"type":"long"}' \
--property value.schema='{"type":"long"}'
但是我得到“未知的魔术字节!” org.apache.kafka.common.errors.SerializationException
是否可以使用未通过Confluent的AvroSerializer和Schema Registry序列化的Confluent kafka-avro-console-consumer来使用来自Kafka的Avro消息?
答案 0 :(得分:2)
Confluent Schema Registry序列化器/反序列化器使用wire format,它在消息的初始字节中包含有关模式ID的信息。
如果您的消息尚未使用Schema Registry序列化程序进行序列化,则您将无法对其进行反序列化,并会收到Unknown magic byte!
错误。
因此,您需要编写一个使用方来提取消息,使用Avro avsc模式进行反序列化,然后假设您要保留数据,使用Schema Registry serializer
编辑:我最近写了一篇文章,更深入地解释了整个过程:https://www.confluent.io/blog/kafka-connect-deep-dive-converters-serialization-explained
答案 1 :(得分:1)
kafka-console-consumer
不了解key.schema
或value.schema
,只有Avro 生产者知道。 Source code here
常规控制台使用者不关心数据的格式-它将只打印UTF8编码的字节
kafka-avro-console-consumer
接受的属性仅为schema.registry.url
。因此,要回答这个问题,是的,需要使用Confluent序列化器对其进行序列化。