如何正确反序列化avro字符串的kafka密钥

时间:2019-08-26 15:57:51

标签: java apache-kafka avro apache-kafka-streams

我们正在使用kafka流处理器来处理生产者提供给我们的一些数据。但是,我们很难正确处理键,而又不会导致看不见的字符或转换错误。密钥的架构如下'{"type": "string"}')

已经存在并且大部分有效的方法是这样配置流:

properties.put(
    StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, 
    Serdes.String().getClass());

properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, 
    GenericAvroSerde.class);

final Serde<String> stringSerde = Serdes.String();
        final Serde<GenericRecord> avroSerde = new 
GenericAvroSerde();
boolean isKeySerde = false;
avroSerde.configure(
    Collections.singletonMap(                          
        AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG,
        propFile.getProperty("SchemaRegistry")),
    isKeySerde);

KStream<String, GenericRecord> stream = 
    streamsBuilder.stream(inputTopic);

这会导致键602看起来像\u0000\u0000\u0000\u0000R\u0006602

尝试在关键上使用Avro Serde会导致生成错误:

properties.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, 
    GenericAvroSerde.class);

properties.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, 
    GenericAvroSerde.class);

final Serde<String> stringSerde = new GenericAvroSerde();
stringSerde.configure(
    Collections.singletonMap(                            
        AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG,
        propFile.getProperty("SchemaRegistry")), true);

final Serde<GenericRecord> avroSerde = new GenericAvroSerde();
boolean isKeySerde = false;
avroSerde.configure(
    Collections.singletonMap(                     
        AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG,
        propFile.getProperty("SchemaRegistry")),
    isKeySerde);

KStream<String, GenericRecord> stream = 
    streamsBuilder.stream(inputTopic);

这会导致生成错误: incompatible types: io.confluent.kafka.streams.serdes.avro.GenericAvroSerde cannot be converted to org.apache.kafka.common.serialization.Serde<java.lang.String>

有人在构建流处理器时遇到了类似的问题吗?

谢谢, -瑞恩

0 个答案:

没有答案