融合Kafka Rest代理-Avro反序列化

时间:2019-03-08 11:17:20

标签: apache-kafka confluent kafka-rest

我正在尝试使用Confluent Kafka REST代理从我的一个主题中检索Avro格式的数据,但是不幸的是我遇到了反序列化错误。我正在使用以下命令查询Kafka REST代理

 curl -X GET -H "Accept: application/vnd.kafka.avro.v2+json" 
http://localhost:8082/consumers/my-group/instances/my-consumer/records?timeout=30000

我得到回应

{
  "error_code": 50002,
  "message": "Kafka error: Error deserializing key/value for partition input-0 at offset 0. If needed, please seek past the record to continue consumption."
}

以及Kafka Rest Proxy服务器上的日志是:

org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition input-0 at offset 0. If needed, please seek past the record to continue consumption.
Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id -1
Caused by: org.apache.kafka.common.errors.SerializationException: Unknown magic byte!

数据已使用KafkaAvroSerializer生成,并且该模式存在于Schema Registry中。另外请注意,使用CLI上的avro-console-consumer可以读取数据。

有人知道如何解决此问题吗?

2 个答案:

答案 0 :(得分:0)

最有可能的是,除了关于该主题的有效Avro消息外,您也有无效的消息。这就是该错误的含义,也正是我尝试通过REST代理在本地使用非Avro消息时遇到的错误:

ERROR Unexpected exception in consumer read task id=io.confluent.kafkarest.v2.KafkaConsumerReadTask@2e20d4f3  (io.confluent.kafkarest.v2.KafkaConsumerReadTask)
org.apache.kafka.common.errors.SerializationException: Error deserializing key/value for partition avrotest-0 at offset 2. If needed, please seek past the record to continue consumption.
Caused by: org.apache.kafka.common.errors.SerializationException: Error deserializing Avro message for id -1
Caused by: org.apache.kafka.common.errors.SerializationException: Unknown magic byte!

我将使用诸如kafkacat之类的工具来检查实际消息是否位于错误给出的偏移处,例如:

kafkacat -C -b localhost:9092 -t test_topic_avro -o 0 -c 1

-o 0将消耗偏移量为0的消息,而-c 1意味着仅消耗一条消息。

您也可以Git Plugin,例如对于主题avrotest,将偏移量移至1

echo '{ "offsets": [ { "topic": "avrotest", "partition": 0, "offset": 1 } ] }' | \
http POST localhost:8082/consumers/rmoff_consumer_group/instances/rmoff_consumer_instance/positions \
Content-Type:application/vnd.kafka.v2+json

答案 1 :(得分:0)

直到最近才支持在其余代理中使用字符串键和 AVRO 值:

https://github.com/confluentinc/kafka-rest/issues/210

最近代码已经合并,但问题仍然存在且文档尚未完全更新:

https://github.com/confluentinc/kafka-rest/pull/797