Apache kafka 如何管理Kafka KStream到KStream的窗口连接?

Apache kafka 如何管理Kafka KStream到KStream的窗口连接?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,基于KStream到KStream的连接始终是窗口连接,我的问题是如何控制窗口的大小?保存主题数据的大小是否相同?或者,例如,我们可以将数据保留一个月,但只在过去一周加入流 有没有什么好的示例可以显示一个带窗口的KStream到KStream的窗口连接 在我的例子中,假设我有2个KStream,kstream1和kstream2,我希望能够加入10天的kstream1到30天的kstream2。这是绝对可能的。定义流运算符时,需要显式指定联接窗口的大小 KStream stream1=。。。;

基于KStream到KStream的连接始终是窗口连接,我的问题是如何控制窗口的大小?保存主题数据的大小是否相同?或者,例如,我们可以将数据保留一个月,但只在过去一周加入流

有没有什么好的示例可以显示一个带窗口的KStream到KStream的窗口连接


在我的例子中,假设我有2个KStream,kstream1和kstream2,我希望能够加入10天的kstream1到30天的kstream2。

这是绝对可能的。定义流运算符时,需要显式指定联接窗口的大小

KStream stream1=。。。; KStream stream2=。。。; 长接缝窗框尺寸=5L*60L*1000L;//5分钟 长窗保留时间ms=30L*24L*60L*60L*1000L;//30天 流程1.2, ... // 添加估价师 JoinWindows.ofjoinWindowSizeMs ; //或者如果要使用保留时间 流程1.2, ... // 添加估价师 JoinWindowsJoinWindows.ofjoinWindowSizeMs .UntilWindorEventationTimems ; 有关更多详细信息,请参阅

滑动窗口基本上定义了一个附加的连接谓词。在类似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。如果使用JoinWindowsbefore和JoinWindowsafter显式设置这些值,则before和after也可以具有不同的值


源主题的保留时间完全独立于应用于Kafka Streams本身创建的变更日志主题的指定WindowRetentionTimes。窗口保留允许将无序记录相互连接,即延迟到达的记录请记住,Kafka有基于偏移量的订购保证,但关于时间戳,记录可能会无序。

除了Matthias J.Sax所说的,还有一个流到流的窗口连接示例:

这适用于融合了Apache Kafka 0.10.1的3.1.x版本,即2017年1月的最新版本。有关使用较新版本的代码示例,请参见上面存储库中的主分支

这是上面代码示例的关键部分,对于Kafka 0.10.1,稍微适合您的问题。请注意,此示例恰好演示了外部联接

long joinWindowSizeMs=时间单位.MINUTES.toMillis5; 长窗口保留时间ms=TimeUnit.DAYS.toMillis30; 最终Serde stringSerde=Serdes.String; KStreamBuilder builder=新的KStreamBuilder; KStream alerts=builder.streamstringSerde、stringSerde、AdImpressionTopic; KStream事件=builder.streamstringSerde、stringSerde、adClicksTopic; KStream impressionsAndClicks=alerts.outerjoin事件, 印象值,点击值->印象值+/+点击值, //KStream KStream联接始终是窗口联接,因此我们必须提供联接窗口。 JoinWindows.ofjoinWindowSizeMs.UntilWindowEventionTimems, 斯特林塞德,斯特林塞德,斯特林塞德; //将结果写入输出主题。 压印和点击。到字符串塞德,字符串塞德,输出;
谢谢,当我可以运行它时,我将检查它并接受您的答案。我已经阅读了您提到的大多数示例,但我也找不到任何KStream Windowed Join。我如何指定不同的窗口大小,因为在我的例子中,我想将10天的stream-1与30天的stream-2合并在一起,对这些示例表示担忧。似乎只有KTable连接。。。还以为有一个KStream KStream加入。无论如何关于加入10天的stream-1和30天的stream-2:这在Kafka Streams中是不可能的,因为Kafka Streams只支持滑动窗口加入-您需要跳窗口加入。您能解释一下您的答案吗,joinWindowSizeMs和windowRetentionTimeMs之间的区别是什么?因为我不能使用JoinWindow.ofjoinWindowSizeMs.UntilWindowEventTimes,直到我可以使用JoinWindow.ofjoinWindowSizeMs,它才接受的输出。除此之外,当你使用timming时,它只适用于第二个流,或者两者都适用?基于KStream中的Bucase从我得到的KStream连接窗口时间适用于两个流,对吗?刚刚更新了我的问题。如果您使用直到,您需要添加一个cast使其工作。如果即将发布的0.10.2版本,我将添加一个修复程序。如果您不了解窗口保留时间,现在就忽略它-这并不重要。或者请开始一个新的问题来保持干净。把多个问题混为一谈是不好的。是的,窗口时间大小适用于这两个流。请参阅类似SQL的语句以了解其工作原理。