簡體   English   中英

如何管理Kafka KStream到Kstream窗口加入?

[英]How to manage Kafka KStream to Kstream windowed join?

基於apache Kafka docs KStream-to-KStream Joins are always windowed joins ,我的問題是如何控制窗口的大小? 保持主題數據的大小是否相同? 或者,例如,我們可以將數據保留1個月,但過去一周加入流?

是否有任何好的示例來顯示窗口化的KStream-to-kStream窗口連接?

在我的情況下,假設我有2個KStream, kstream1kstream2我希望能夠加入10天的kstream1到30天的kstream2

這絕對是可能的。 定義Stream運算符時,可以顯式指定連接窗口大小。

KStream stream1 = ...;
KStream stream2 = ...;
long joinWindowSizeMs = 5L * 60L * 1000L; // 5 minutes
long windowRetentionTimeMs = 30L * 24L * 60L * 60L * 1000L; // 30 days

stream1.leftJoin(stream2,
                 ... // add ValueJoiner
                 JoinWindows.of(joinWindowSizeMs)
);

// or if you want to use retention time

stream1.leftJoin(stream2,
                 ... // add ValueJoiner
                 (JoinWindows)JoinWindows.of(joinWindowSizeMs)
                                         .until(windowRetentionTimeMs)
);

有關詳細信息,請參閱http://docs.confluent.io/current/streams/developer-guide.html#joining-streams

滑動窗口基本上定義了一個額外的連接謂詞。 在類似SQL的語法中,這將是:

SELECT * FROM stream1, stream2
WHERE
   stream1.key = stream2.key
   AND
   stream1.ts - before <= stream2.ts
   AND
   stream2.ts <= stream1.ts + after

其中before == after == joinWindowSizeMs in this example。 如果使用JoinWindows#before()JoinWindows#after()來顯式設置這些值,則beforeafter也可以有不同的值。

源主題的保留時間完全獨立於應用於Kafka Streams自身創建的更改日志主題的指定windowRetentionTimeMs 窗口保留允許彼此連接無序記錄,即遲到的記錄(請記住,Kafka具有基於偏移的訂購保證,但關於時間戳 ,記錄可能是亂序的) 。

除了Matthias J. Sax所說的,還有一個流到流(窗口)的連接示例: https//github.com/confluentinc/examples/blob/3.1.x/kafka-streams/src/test /java/io/confluent/examples/streams/StreamToStreamJoinIntegrationTest.java

這適用於使用Apache Kafka 0.10.1的Confluent 3.1.x,即截至2017年1月的最新版本。有關使用較新版本的代碼示例,請參閱上面存儲庫中的master分支。

這是上面代碼示例的關鍵部分(同樣,對於Kafka 0.10.1),稍微適應了您的問題。 請注意,此示例恰好演示了OUTER JOIN。

long joinWindowSizeMs = TimeUnit.MINUTES.toMillis(5);
long windowRetentionTimeMs = TimeUnit.DAYS.toMillis(30);

final Serde<String> stringSerde = Serdes.String();
KStreamBuilder builder = new KStreamBuilder();
KStream<String, String> alerts = builder.stream(stringSerde, stringSerde, "adImpressionsTopic");
KStream<String, String> incidents = builder.stream(stringSerde, stringSerde, "adClicksTopic");

KStream<String, String> impressionsAndClicks = alerts.outerJoin(incidents,
    (impressionValue, clickValue) -> impressionValue + "/" + clickValue,
    // KStream-KStream joins are always windowed joins, hence we must provide a join window.
    JoinWindows.of(joinWindowSizeMs).until(windowRetentionTimeMs),
    stringSerde, stringSerde, stringSerde);

// Write the results to the output topic.
impressionsAndClicks.to(stringSerde, stringSerde, "outputTopic");

暫無
暫無

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

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