在Apache Flink Broadcast流中应用基于窗口的规则

时间:2019-11-07 10:03:50

标签: java apache-flink flink-streaming flink-cep flink-sql

我在Apache Flink的BroadcastStream中有一组规则。 我可以在事件流中应用新规则。 但是我无法弄清楚如果我的规则像

一样如何执行
rule 1> alert when count of event a is greater than 5 in a window of 5 mins
rule 2> alert when count of event a is greater than 4 in a window of 15 mins

我是新手。我无法弄清楚。

1 个答案:

答案 0 :(得分:0)

基于flink-sql或flink-cep的应用程序将无法执行此操作,因为这些库只能处理在编译作业时定义的规则。您可能需要为每个新规则开始一个新工作,这可能不符合您的要求。

如果您要拥有一个可以处理作业运行时提供的动态规则集的作业,则必须自己构建该作业。您可以使用KeyedBroadcastProcessFunction来执行此操作(听起来您已经开始尝试)。

以下是可能的实现方式的草图:

您可以在KeyedBroadcastProcessFunction中使用键控状态来跟踪每个窗口中的当前计数。如果可以通过时间间隔和计数阈值来表征规则,则可以使用MapState,其中键是规则ID,映射中的值是该规则的当前计数。您可以为在每个窗口结束时触发的每个规则设置一个计时器。

事件到达时,您将循环访问基于规则的映射,为每个相关规则增加计数器。当计时器启动时,您会找到相关规则,将计数器与阈值进行比较,采取适当的措施,然后清除这些计数器。

一些潜在的并发症要记住:

  1. 此实现要求您使用keyBy对流进行分区,以便可以使用MapState和计时器。
  2. 广播流没有与之关联的计时器,因此必须由处理键控流的processElement方法来管理计时器。
  3. Flink仅允许一个计时器用于给定的键和给定的时间戳。因此,请务必谨慎处理是否需要同时触发两个规则的情况。
  4. 如果事件无法按顺序到达,那么您将需要先按时间戳对流进行排序,或者允许同时打开多个窗口。