java在ApacheFlink广播流中应用基于窗口的规则

qxgroojn  于 2021-06-24  发布在  Flink
关注(0)|答案(1)|浏览(321)

我在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

我是个新手。我想不通。

sqyvllje

sqyvllje1#

基于flink sql或flink cep的应用程序将无法做到这一点,因为这些库只能处理在编译作业时定义的规则。你将需要为每一个新规则开始一个新的工作,这可能不符合你的要求。
如果希望有一个作业可以处理在作业运行时提供的一组动态规则,则必须自己构建这个作业。你可以使用 KeyedBroadcastProcessFunction 要做到这一点(听起来你已经开始尝试了)。
下面是一个可能实现的草图:
您可以在keyedbroadcastprocessfunction中使用keyed状态来跟踪每个窗口中的当前计数。如果规则可以用时间间隔和计数阈值来表示,那么可以使用 MapState ,其中键是规则ID,Map中的值是该规则的当前计数。您可以为每个窗口结束时触发的每个规则设置计时器。
当事件到达时,您遍历基于规则的Map,增加每个相关规则的计数器。当计时器启动时,您可以找到相关的规则,将计数器与阈值进行比较,采取适当的操作,然后清除这些计数器。
要记住一些潜在的并发症:
这个实现需要用一个 keyBy ,以便可以使用mapstate和计时器。
广播流不能有与之关联的计时器,因此计时器必须由 processElement 处理键控流的方法。
flink只允许对给定的密钥和时间戳使用一个计时器。因此,如果您必须处理需要同时触发两个规则的情况,请小心。
如果事件可能无序到达,则需要首先按时间戳对流进行排序,或者允许同时打开多个窗口。

相关问题