【问题标题】:Cannot print Kafka Avro decoded message无法打印 Kafka Avro 解码消息
【发布时间】:2017-08-27 13:22:09
【问题描述】:

我有一个基于 C++ 的遗留系统,它会输出支持融合 Avro 模式注册表格式的二进制编码 Avro 数据。在我的 Java 应用程序中,我使用 KafkaAvroDeserializer 类成功地反序列化了消息,但无法打印出消息。

private void consumeAvroData(){
    String group = "group1";
    Properties props = new Properties();
    props.put("bootstrap.servers", "http://1.2.3.4:9092");
    props.put("group.id", group);
    props.put("enable.auto.commit", "true");
    props.put("auto.commit.interval.ms", "1000");
    props.put("session.timeout.ms", "30000");
    props.put("key.deserializer", LongDeserializer.class.getName());
    props.put("value.deserializer", KafkaAvroDeserializer.class.getName());
   // props.put(KafkaAvroDeserializerConfig.SPECIFIC_AVRO_READER_CONFIG,"false");
    props.put("schema.registry.url","http://1.2.3.4:8081");
    KafkaConsumer<String, GenericRecord> consumer = new KafkaConsumer<String, GenericRecord>(props);

    consumer.subscribe(Arrays.asList(TOPIC_NAME));
    System.out.println("Subscribed to topic " + TOPIC_NAME);

    while (true) {
        ConsumerRecords<String, GenericRecord> records = consumer.poll(100);
        for (ConsumerRecord<String, GenericRecord> record : records)
        {
            System.out.printf("value = %s\n",record.value());
        }
    }
}

我得到的输出是

{"value":"�"}

为什么我不能打印反序列化的数据?任何帮助表示赞赏!

【问题讨论】:

    标签: apache-kafka avro confluent-platform avro-tools


    【解决方案1】:

    Confluent Avro Serializer 的线格式记录在标题为“线格式”的部分中

    http://docs.confluent.io/current/schema-registry/docs/serializer-formatter.html

    它是一个魔术字节(当前始终为 0),后跟 Schema Registry 返回的 4 字节 Schema ID,后面跟着一组字节,这些字节是 Avro 二进制编码中的 Avro 序列化数据。

    如果您将消息作为 ByteArray 读取并打印出前 5 个字节,您将知道这是否真的是 Confluent Avro 序列化消息。应该是 0 后跟 0001 或其他一些架构 ID,您可以检查它是否在此主题的架构注册表中。

    如果不是这种格式,那么消息可能会以另一种方式序列化(没有 Confluent Schema Registry),您需要使用不同的反序列化器,或者可能从消息值中提取完整的 Schema,甚至需要获取原始 Schema 文件来自其他来源以便能够解码。

    【讨论】:

    • 感谢您的回复!我尝试手动解析字节数组(不使用 Confluent 反序列化器),我可以打印魔术字节、Schema ID,但由于某种原因我无法打印数据。
    • 该数据是二进制格式。你不能打印出来。架构 ID 是否与您在架构注册表中为此主题配置的内容匹配?
    • 是的。在替代方法中,我使用 avsc 文件对传入的解析数据进行解码,然后尝试打印出 GenericRecord。我可以将第一个字节视为魔术字节,将 2,3,4,5 字节视为模式 ID,其余字节(6 直到数组 1 的长度),我将其视为数据并使用 Avro bytearray 反序列化器查看数据
    猜你喜欢
    • 2016-08-28
    • 2016-10-08
    • 2018-01-12
    • 2021-04-13
    • 2016-12-07
    • 2016-01-16
    • 1970-01-01
    • 2016-11-10
    • 2020-12-13
    相关资源
    最近更新 更多