簡體   English   中英

Kafka Stream如何使用KTable#Suppress發送最終聚合?

[英]How does Kafka Stream send final aggregation with KTable#Suppress?

我想做的是這樣的:

  1. 消費主題的記錄
  2. 計算每個1秒窗口的值
  3. 檢測記錄num <4的窗口
  4. 將最終結果發送到另一個主題

我使用抑制發送最終結果,但是出現了這樣的錯誤。

09:18:07,963 ERROR org.apache.kafka.streams.processor.internals.ProcessorStateManager  
- task [1_0] Failed to flush state store KSTREAM-AGGREGATE-STATE-STORE-0000000002: 
java.lang.ClassCastException: org.apache.kafka.streams.kstream.Windowed cannot be cast to java.lang.String
at org.apache.kafka.common.serialization.StringSerializer.serialize(StringSerializer.java:28)
at org.apache.kafka.streams.kstream.internals.suppress.KTableSuppressProcessor.buffer(KTableSuppressProcessor.java:86)
at org.apache.kafka.streams.kstream.internals.suppress.KTableSuppressProcessor.process(KTableSuppressProcessor.java:78)
at org.apache.kafka.streams.kstream.internals.suppress.KTableSuppressProcessor.process(KTableSuppressProcessor.java:37)
at org.apache.kafka.streams.processor.internals.ProcessorNode.process(ProcessorNode.java:115)
at org.apache.kafka.streams.processor.internals.ProcessorContextImpl.forward(ProcessorContextImpl.java:146)
.....

我認為我的代碼與開發人員指南中的示例相同。 有什么問題? 我的代碼在這里。

final KStream<String, String> views = builder.stream("fluent-newData");
final KTable<Windowed<String>, Long> anomalousUsers = views
    .map((key, value) -> {
       JSONObject message = JSONObject.fromObject(value);
       String[] strArry = message.getString("detail").split(",");
       return KeyValue.pair(strArry[0], value);
    })
    .groupByKey()
    .windowedBy(TimeWindows.of(Duration.ofSeconds(1))
    .grace(Duration.ofSeconds(20)))
    .count()
    .suppress(Suppressed.untilWindowCloses(unbounded()))
    .filter((windowedUserId, count) -> count < 4);

final KStream<String, String> anomalousUsersForConsole = anomalousUsers
    .toStream()
    .filter((windowedUserId, count) -> count != null)
    .map((windowedUserId, count) -> new KeyValue<>(windowedUserId.toString(), windowedUserId.toString() +" c:" + count.toString()));

anomalousUsersForConsole.to("demo-count-output", Produced.with(stringSerde, stringSerde));

當您未直接指定Serdes時,通常會拋出“無法將Windowed轉換為java.lang.String”

在構建stream(..) ,直接指定消耗的實例,如下所示:

builder.stream("fluent-newData", Consumed.with(Serdes.String(), Serdes.String()))

同樣對於groupByKey()您還需要像下面這樣傳遞Grouped

 .groupByKey(Grouped.with(Serdes.String(), Serdes.String()))

暫無
暫無

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

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