带有kafka-avro-console-consumer的未知魔术字节

时间:2018-09-19 06:24:19

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

我一直在尝试将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消息?

2 个答案:

答案 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.schemavalue.schema,只有Avro 生产者知道。 Source code here

常规控制台使用者不关心数据的格式-它将只打印UTF8编码的字节

kafka-avro-console-consumer接受的属性仅为schema.registry.url。因此,要回答这个问题,是的,需要使用Confluent序列化器对其进行序列化。