簡體   English   中英

kafka 流跳躍窗口聚合導致多個 windows 在時間戳為零

[英]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.

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