1

以下讨论是在Apache Flink的上下文中进行的:

想象一下,如果我们要计算每个事件在 10 分钟内keyedStream到达的事件数量,假设我们有一个其键是它的键,事件时间是它的时间戳。id

需要解决的问题是:

  1. 如何设计窗户
    • 我们可以在每个事件到达后创建一个 10 分钟的窗口,但这意味着对于每个事件,都会有 10 分钟的延迟,因为等待 10 分钟的窗口。
    • 我们可以创建一个 10 分钟的窗口,将每个事件的时间戳作为这个窗口的最大时间戳,也就是说我们不需要等待 10 分钟,因为我们取的是元素到达前最后 10 分钟的元素. 但据我所知,这种窗口并不容易定义。
  2. 如何处理内存或其他资源问题?即使我们成功创建了一个窗口,可能事件的id类型是多种多样的,这么多窗口,系统如何将它们的状态保存在内存中?内存溢出的可能性很大。

可能有一些问题我在这里没有提到,或者除了window(即Patterns)之外还有一些好的解决方案。如果你有好的解决方法,请给我一个线索,谢谢。

4

1 回答 1

1

您可以使用 GlobalWindow 和 Trigger 来执行此操作,而不是在每个事件上触发,并使用 Evictor 在计算剩余事件之前删除超过 10 分钟的事件。(然而,一个幼稚的实现很容易表现得很差。)

是的,这可能需要保留很多状态——您将保留过去 10 分钟内的每个事件(好吧,您只需要存储每个事件的时间戳)。如果你设置 RocksDB 状态后端,那么 Flink 会在需要时溢出到磁盘,但会带来一些明显的性能损失。使用足够大的集群在内存中容纳 10 分钟的流量可能会更好。即使每秒有一百万个事件,每个事件都有一个 32 位时间戳,在 10 分钟内也只有 2.4GB(每秒 100 万个事件 x 600 秒 x 每个事件 4 个字节)——似乎根本不是问题。

于 2017-12-04T19:42:52.897 回答