簡體   English   中英

如何從 kafka 流獲取窗口聚合?

[英]How to get windowed aggregation from kafka stream?

我有一個事件流,我想根據時間窗口聚合這些事件。 我的解決方案提供增量聚合,而不是在定時窗口上進行聚合。 我已經讀過這對於流來說是正常的,因為它會將結果作為更改日志。 同樣在研究期間,我遇到了 Kafka Streams DSL 的 2 步窗口聚合以及如何發送時間窗口 KTable 的最終 kafka-streams 聚合結果? . 但是第一篇文章中的解決方案有些過時(使用已棄用的 API)。 我使用了那些已棄用的 API 中建議的新 API。 這是我的解決方案

KStream<String, Event> eventKStream = summarizableData.mapValues(v -> v.getEvent());
    KGroupedStream<String, Event> kGroupedStream = eventKStream.groupBy((key, value) -> {
             String groupBy = getGroupBy(value, criteria);
             return groupBy;
    }, Serialized.with(Serdes.String(), eventSerde));


    long windowSizeMs = TimeUnit.SECONDS.toMillis(applicationProperties.getWindowSizeInSeconds());
    final TimeWindowedKStream<String, Event> groupedByKeyForWindow = kGroupedStream
            .windowedBy(TimeWindows.of(windowSizeMs)
                    .advanceBy(windowSizeMs));

但是,正如我之前所解釋的,我的結果不是在特定時間窗口中給出的,而是作為增量聚合給出的。 我需要我的數據按照 windowSize 中給定的時間輸出。 我還讀到CACHE_MAX_BYTES_BUFFERING_CONFIG可以控制輸出,但我需要一些可靠的解決方案適用於每種情況。 另請注意, https: //cwiki.apache.org/confluence/display/KAFKA/Windowed+aggregations+over+successively+increasing+timed+windows wiki 中給出的模式現在已經過時,因為它使用舊的 API。 (我使用的是 kafka-streams 1.1.0 版本)

問題是我的錯誤。 以上,代碼示例工作正常。 但最后我已將KTable轉換為KStream 那就是問題所在。 轉換為KStream導致輸出中間結果。 https://cwiki.apache.org/confluence/display/KAFKA/Windowed+aggregations+over+successively+increasing+timed+windows 中給出的模式工作正常。 通過有問題的代碼是,

// Aggregation

KTable<Windowed<String>, Event> results = groupedByKeyForWindow.aggregate(new AggregateInitiator(), new EventAggregator());

// This converstion causing changelog to output. Instead use next line.
KStream<String, AggregationMessage> aggregationMessageKStream = results.toStream((key, value) -> key.toString())
                .mapValues(this::convertToAggregationMessage).filter((k, v) -> v != null);

// output KTable to sample topic. But this output controlled by 
// COMMIT_INTERVAL_MS_CONFIG and CACHE_MAX_BYTES_BUFFERING_CONFIG parameters. 
// I'm using default values for these params.
results.to(windowedSerde, eventSerde,  "Sample");

暫無
暫無

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

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