Kafka Consumer无法反序列化具有开始时间和结束时间的时间窗口密钥

时间:2019-05-09 13:14:02

标签: kafka-consumer-api apache-kafka-streams

我有一个Kafka Streams应用程序(V 2.1.1),该应用程序生成记录并以键值格式放入输出主题。

键是窗口时间序列,我希望在其中输入键和窗口开始/结束时间的句柄。

示例-

.to(kafkaOutPutTopic, Produced.with(windowedSerde, jsonSerde));

示例-[KEY @ 1551807076000/1551807077000] 其中KEY为键,开始时间-1551807076000和结束时间-1551807077000

WindowedSerde在哪里

StringSerializer stringSerializer = new StringSerializer();

final TimeWindowedSerializer<String> windowedSerializer = new TimeWindowedSerializer(stringSerializer);

final TimeWindowedDeserializer<String> windowedDeSerializer = new TimeWindowedDeserializer();

final Serde<Windowed<String>> windowedSerde = Serdes.serdeFrom(windowedSerializer, windowedDeSerializer);

还有一个名为kafka的组件,它通过使用自定义类的DeSerializering尝试消耗主题中的消息并掌握键和窗口的开始/结束时间。

kafka属性:

kafkaConsumerProperties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, TimeWindowedDeserializer.class.getName()); 

我正在使用附加链接-https://gist.github.com/nfo/eaf350afb5667a3516593da4d48e757a

中的TimeWindowedDeserializer.java

但是可以获取窗口结束时间,并且由于反序列化,使用者无法使用它。

1 个答案:

答案 0 :(得分:0)

似乎您正在击中https://issues.apache.org/jira/browse/KAFKA-7110

在2.2.0中已修复,可以将窗口大小传递给构造函数或TimeWindows

请注意,窗口结束时间戳和窗口大小均未存储在数据中。这是一项存储优化,因为对于TimeWindows,所有窗口的大小均相同,因此可以根据起始时间戳加上窗口大小来计算结束时间戳。