簡體   English   中英

使用 kafka 流計算具有相同鍵值的 kafka 消息

[英]Counting kafka messages with same key value using kafka streams

我有一個 Java Spring Kafka 應用程序,它將 Book 類型的對象發送到 Kafka 主題。 然后我嘗試使用 Kafka 流來映射每條消息以將 Book 的作者作為其鍵。 然后我試圖將它們添加到一個 KTable 中,該 KTable 包含密鑰和具有此密鑰的消息數。 然后將該表發送到輸出 kafka 主題。

圖書型號:

@Data
public class Book {
    private UUID id;
    private String name;
    private String author;
    private LocalTime date;
}

流結構:

StreamsBuilder streamsBuilder = new StreamsBuilder();
        KStream<String,Book> stream = streamsBuilder.stream("input_topic", Consumed.with(Serdes.String(), new BookSerde()));
        stream = stream.selectKey((key,value)->value.getAuthor());
 
        KTable<String ,Long> keyWithCount = stream.groupBy((key, value) -> value.getAuthor()).count();
        keyWithCount.toStream().to("output_topic", Produced.with(Serdes.String(), Serdes.Long()));
 
        KafkaStreams kafkaStreams = new KafkaStreams(streamsBuilder.build(), config);
        kafkaStreams.start();

運行應用程序后,輸出顯示每個唯一鍵,但隨機表情而不是計數。

我在弄亂.peek()后發現了一件奇怪的事情。 我在發送到主題之前打印了鍵和值,它表明它按應有的方式工作! 然而,問題是該主題的 kafka 控制台消費者沒有在計數中顯示數字,而是顯示一些隨機符號,例如鑽石、心形、笑臉等。

一個例子是,在將帶有“A”的書作為作者發送給我的制作人到父主題后,我的流媒體應用程序將其視為第一本書,打印“A 1”但在 kafka-console-consumer 中它看起來像“A ☺ ”。

我對 peek() 的發現應該是贈品。 問題不在於代碼,而在於 kafka-console-consumer 的配置。 默認值反序列化程序無法反序列化長值。 為了解決這個問題,我必須在初始化消費者時添加--value-deserializer "org.apache.kafka.common.serialization.LongDeserializer"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM