[英]kafka streams hopping windowed aggregation causing multiple windows at timestamp zero
Kafka Streams DSL 窗口聚合導致多個 windows。
@StreamListener("input")
public void process(KStream<String, Data> DataKStream) {
JsonSerde<DataAggregator> DataJsonSerde =
new JsonSerde<>(DataAggregator.class);
DataKStream
.groupByKey()
.windowedBy(TimeWindows.of(60000).advanceBy(30000))
.aggregate(
DataAggregator::new,
(key, Data, aggregator) -> aggregator.add(Data),
Materialized.with(Serdes.String(), DataJsonSerde)
);
}
數據聚合器.java
public class DataAggregator {
private List<String> dataList = new ArrayList<>();
public DataAggregator add(Data data) {
dataList.add(data.getId());
System.out.println(dataList);
return this;
}
public List<String> getDataList() {
return dataList;
}
}
我根據鍵對輸入數據進行分組,然后執行 1 分鍾 window 和 30 秒跳躍,在聚合器中我只是收集數據並顯示。
我期待 1 window 一開始和 30 秒后另一個 window。 但是實際的 output 是不同的,因為它本身 2 windows 正在創建。
預期的:
[1]
[1, 2]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6] // till 30 seconds only one window
[6] // new window after 30 seconds
[1, 2, 3, 4, 5, 6, 7]
[6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
[6, 7, 8]
實際 output:
[1]
[1]
[1, 2]
[1, 2]
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6] // duplicate window even before 30 seconds
[6] // new window after 30 seconds and 1 window from earlier will be dropped
[1, 2, 3, 4, 5, 6, 7]
[6, 7]
因為我希望 window 在 1 分鍾內達到 30 秒 window。 我相信,最初應該只有一個 window 並且在 30 秒后應該創建另一個 window。
有人可以告訴我,實際的 output 是預期行為還是我遺漏了什么?
注意:我每 4 秒獲取一次輸入數據,預期/實際 output 僅用於表示。
來自 Kafka 文檔:
跳躍時間 windows 與 epoch 對齊,區間下限包含在內,上限不包含在內。 “與時代對齊”意味着第一個 window 從時間戳零開始。 例如,跳躍 windows 的大小為 5000 毫秒,前進間隔(“跳躍”)為 3000 毫秒,具有可預測的 window 邊界 [0;5000),[3000;8000),... - 而不是 [1000) 4000;9000),... 甚至是“隨機”的東西,例如 [1452;6452),[4452;9452),....
因為您的 windows 重疊,所以每個時間戳都會有多個 windows。 對於您的特定 window 配置,您總是會得到 2 windows(以毫秒為單位):
[0,60000) [60000,12000) [12000,18000) ...
[30000,90000) [90000,15000) ...
您無法更改此行為,但是,您可以在結果上應用filter()
(即, aggregate(...).filter(...)
以刪除您不感興趣的 windows。
此外,默認情況下,Kafka Streams 使用記錄事件時間。 有一個WallclockTimestampExtractor
,但它僅在您明確設置時使用。 參照。 https://docs.confluent.io/current/streams/developer-guide/config-streams.html#default-timestamp-extractor
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.