以下讨论是在apache flink的背景下进行的:
假设我们有一个 keyedStream
它的钥匙是谁的 id
事件时间是它的时间戳,如果我们想计算每个事件在10分钟内有多少事件到达。
需要解决的问题有:
如何设计Windows?
我们可以在每个事件到达后创建一个10分钟的窗口,但这意味着对于每个事件,都会有10分钟的延迟,因为等待的窗口是10分钟。
我们可以创建一个10分钟的窗口,该窗口将每个事件的时间戳作为该窗口中的最大时间戳,这意味着我们不需要等待10分钟,因为我们在元素到达之前占用元素的最后10分钟。但据我所知,这种窗口并不容易定义。
如何处理内存或其他资源问题?即使我们成功地创建了一个窗口,可能事件的id种类也是多种多样的,那么多这样的窗口,系统是如何将它们的状态保存在内存中的呢?有一个很大的可能性是记忆的stakoverflow。
可能有一些问题我在这里没有提到,或者可能有一些好的解决方案,除了窗口(即模式)。如果你有一个好的解决方案,请给我一个线索,谢谢。
1条答案
按热度按时间smtd7mpg1#
您可以使用一个globalwindow和一个trigger than对每个事件触发,以及一个executor来执行此操作,该executor在计算剩余事件之前删除超过10分钟的事件(但是,一个简单的实现很容易执行得很差。)
是的,这可能需要保留很多状态——您将保留过去10分钟内的每个事件(您只需要存储每个事件的时间戳)。如果您设置rocksdb状态后端,那么flink将在需要时溢出到磁盘,但会有一些明显的性能损失。最好使用足够大的集群来存储10分钟的通信量。即使每秒一百万个事件,每个事件都有一个32位的时间戳,在10分钟内也只有2.4gb(每秒一百万个事件x 600秒x每个事件4字节)--看起来一点问题都没有。