Apache kafka 使用ConfluentSchemaRegistry反序列化avro数据时发生异常?

Apache kafka 使用ConfluentSchemaRegistry反序列化avro数据时发生异常?,apache-kafka,apache-flink,avro,confluent-platform,confluent-schema-registry,Apache Kafka,Apache Flink,Avro,Confluent Platform,Confluent Schema Registry,我是弗林克和卡夫卡的新手。我正在尝试使用Confluent Schema registry反序列化avro数据。我已经在ec2机器上安装了flink和Kafka。此外,在运行代码之前已经创建了“测试”主题 代码路径: 作为实现的一部分,代码执行以下操作: 1) Create a flink DataStream object using a list of user element. (User class is avro generated class) 2) Write the Datast

我是弗林克和卡夫卡的新手。我正在尝试使用Confluent Schema registry反序列化avro数据。我已经在ec2机器上安装了flink和Kafka。此外,在运行代码之前已经创建了“测试”主题

代码路径:

作为实现的一部分,代码执行以下操作:

1) Create a flink DataStream object using a list of user element. (User class is avro generated class)
2) Write the Datastream source to Kafka using AvroSerializationSchema.
3) Read the data from Kafka using ConfluentRegistryAvroDeserializationSchema by reading the schema from Confluent Schema registry.
运行flink可执行jar的命令:

./bin/flink run -c com.streaming.example.ConfluentSchemaRegistryExample /opt/flink-1.7.2/kafka-flink-stream-processing-assembly-0.1.jar
运行代码时发生异常:

java.io.IOException: Unknown data format. Magic number does not match
    at org.apache.flink.formats.avro.registry.confluent.ConfluentSchemaRegistryCoder.readSchema(ConfluentSchemaRegistryCoder.java:55)
    at org.apache.flink.formats.avro.RegistryAvroDeserializationSchema.deserialize(RegistryAvroDeserializationSchema.java:66)
    at org.apache.flink.streaming.util.serialization.KeyedDeserializationSchemaWrapper.deserialize(KeyedDeserializationSchemaWrapper.java:44)
    at org.apache.flink.streaming.connectors.kafka.internal.KafkaFetcher.runFetchLoop(KafkaFetcher.java:140)
    at org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumerBase.run(FlinkKafkaConsumerBase.java:665)
    at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:94)
    at org.apache.flink.streaming.api.operators.StreamSource.run(StreamSource.java:58)
    at org.apache.flink.streaming.runtime.tasks.SourceStreamTask.run(SourceStreamTask.java:99)
    at org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:300)
    at org.apache.flink.runtime.taskmanager.Task.run(Task.java:704)
    at java.lang.Thread.run(Thread.java:748)
我用于用户类的Avro模式如下所示:

{
  "type": "record",
  "name": "User",
  "namespace": "com.streaming.example",
  "fields": [
    {
      "name": "name",
      "type": "string"
    },
    {
      "name": "favorite_number",
      "type": [
        "int",
        "null"
      ]
    },
    {
      "name": "favorite_color",
      "type": [
        "string",
        "null"
      ]
    }
  ]
}

有人能指出我在使用confluent Kafka schema registry反序列化avro数据时遗漏了哪些步骤吗?

编写avro数据的方式也需要使用注册表,才能使依赖它的反序列化程序正常工作

用于添加一个
ConfluentRegistryAvroSerializationSchema

我认为解决方法是使用不依赖于注册表的
AvroDeserializationSchema


如果您确实想在生产者代码中使用注册表,那么在合并PR之前,您必须在Flink之外使用注册表

我的理解是否正确“我不能将AvroSerializationSchema直接与ConfluentRegistryAvroDeserializationSchema一起使用,因为序列化和反序列化都应该引用ConfluentSchema注册表”?。您是否有任何参考示例代码,我可以在producer code中使用schema registry来参考这些代码?对。据我所知,Flink Avro序列化程序不使用注册表,因此Avro模式将作为每条消息的一部分嵌入。这里可以看到普通的Java producer示例,感谢您的确认。我将尝试引用示例代码,并使用confluent Schema registry测试序列化和反序列化。一旦测试,我会更新我的结果。