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

标签 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

我是 flink 的新手。我无法弄清楚这一点。

最佳答案

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

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

以下是可能实现的草图:

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

当事件到达时,您将迭代基于规则的映射,增加每个相关规则的计数器。当计时器触发时,您会找到相关规则,将计数器与阈值进行比较,采取适当的操作并清除这些计数器。

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

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

关于java - 在 Apache Flink Broadcast 流中应用基于窗口的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58746284/

相关文章:

apache-flink - 如何调试Flink中的可序列化异常?

java - 在Android/Java中解析JSON数据

java - Flink BucketingSink 因 NoClassDefFoundError : Lorg/apache/hadoop/fs/FileSystem 崩溃

java - 使用并发运行的线程将单词添加到数组列表

apache-flink - Apache Flink : Enrich stream with data from external/blocking call

java - 在 Apple M1 Silicon 上运行 Apache Flink 1.12 作业

apache-flink - "Buffer pool is destroyed"当我使用 Flink SlidingEventTimeWindows

java - Apache Flink CEP 如何检测事件是否在 x 秒内没有发生?

java - java中不正确的对象创建

java - Java中有多少个JDBC连接?