用于计算流处理中事件发生的设计?

时间:2017-12-04 10:04:36

标签: streaming bigdata apache-flink flink-streaming flink-cep

以下讨论在 Apache Flink

的背景下进行

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

需要解决的问题是:

  1. 如何设计窗口
    • 我们可以在每个事件到达后创建一个10分钟的窗口,但这意味着每个事件都会有10分钟的延迟,因为等待10分钟的窗口。
    • 我们可以创建一个10分钟的窗口,它将每个事件的时间戳作为此窗口中的最大时间戳,这意味着我们不需要等待10分钟,因为我们需要等待最后10分钟的元素元素到来了。但据我所知,这种窗口并不容易定义。
  2. 如何处理内存或其他资源问题?即使我们成功创建了一个窗口,也许那种事件的ID是多种多样的,这么多窗口,系统如何将状态保存在内存中?内存溢出的可能性非常大。
  3. 也许我在这里没有提到一些问题,或者除了窗口(即模式)之外还有一些好的解决方案。如果你有一个很好的解决方案,请给我一个线索,谢谢。

1 个答案:

答案 0 :(得分:0)

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

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