[英]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, kstream1
和kstream2
我希望能夠加入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()
來顯式設置這些值,則before
和after
也可以有不同的值。
源主題的保留時間完全獨立於應用於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.