Kafka Streams - GenericAvroSerde上的未知魔术字节

时间:2017-12-26 16:10:57

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

当尝试使用Kafka Streams传输Avro数据时,我遇到了这个错误:

Exception in thread "StreamThread-1" org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id -1 Caused by: org.apache.kafka.common.errors.SerializationException: Unknown magic byte!

即使我在邮件列表中找到了几个较旧的线程,但没有一个解决方案解决了这个问题。所以希望我能在这里找到解决方案。

我的设置如下:

StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.String.getClass.getName
StreamsConfig.VALUE_SERDE_CLASS_CONFIG, classOf[GenericAvroSerde]   
AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, localhost:8081)  

我已经尝试将KEY_SERDE设置为与VALUE_SERDE相同,但即使在“邮件列表”中将其“标记”为解决方案,但在我的情况下也不起作用。

我正在使用我的架构生成GenericData.Record,如下所示:

val record = new GenericData.Record(schema)
...
record.put(field, value)

当我启动调试模式并检查生成的记录时,一切看起来都很好,记录中有数据并且映射是正确的。

我像这样流式传输KStream(之前我使用过分支):

splitTopics.get(0).to(s"${destTopic}_Testing")

我正在使用GenericData.Record作为记录。与GenericAvroSerde

结合使用可能会出现问题

1 个答案:

答案 0 :(得分:1)

我的问题的解决方案是在反序列化我从输入主题获得的字符串值后交换VALUE_SERDE

由于Serde是序列化和反序列化的组合“元素”,我不能简单地使用StreamsConfig.VALUE_SERDE_CLASS_CONFIG, classOf[GenericAvroSerde],而是必须使用StringSerde来反序列化输入记录,然后才使用{ {1}}将其写出到输出主题 现在看起来像这样:

AvroSerde

这样,它就像魅力一样 谢谢