java—监视一系列事件一段时间,然后做出决定

tcbh2hod  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(412)

我是个新手。
无论我看到什么教程都集中在非常简单的逻辑和动态数据上。比如当温度在x秒内>100时,等等。

How do I bring in a a logic like this 
1. When the temperature is 90 deg for 10 consecutive records
2. When the temperature for the last 10 minutes is < 90

一个乏味的问题,ApacheFlink支持这种模式吗
我看得见 within x seconds 但没有什么比 for x minutes / for x records

zy1mlcev

zy1mlcev1#

您当然可以使用flink来处理此类用例。
下面我将用flink的窗口操作符勾画一些解决方案。请注意,还有其他方法可以使用自定义函数/运算符来实现这一点,它们可以提供较低的延迟和较少的状态来处理,但需要更多的用户定义代码。
当温度为90度连续记录10次时:
这可以使用一个滑动窗口来完成,该窗口收集10条记录,并按一条记录滑动。您应该将窗口函数实现为一个reduce函数,该函数立即将窗口的记录合并为一个布尔值,该值对所有温度是否大于90度进行编码。这将把空间需求减少到每个窗口一个记录,即一次10个记录(因为同时计算10个窗口)。请注意,计数窗口可能有问题,因为在分布式流处理器中排序有点难以推理。
当温度在过去10分钟内超过90度时:
这可以使用滑动时间窗口来完成,例如,超过10分钟的窗口可以滑动1分钟。这将为您提供1分钟的分辨率,即,它将每分钟检查最后10分钟的温度。同样,每个窗口都有一条记录(10分钟/1分钟窗口一次记录10条,10分钟/30秒窗口一次记录20条,…)。另一个逻辑与上面的计数方法相同。如果使用事件时间逻辑,则可以控制带有无序时间戳的记录。
根据您的用例,窗口方法可能就足够了。如果您需要更好的延迟或者有更好的延迟,那么您也可以以有状态的方式实现您的用例 FlatMapFunction (最后10条记录)或有状态 ProcessFunction 它使您能够访问时间戳和水印,以便更好地控制时间。
更复杂的模式可以通过flink的cep库检测到。

相关问题