我是个新手。
无论我看到什么教程都集中在非常简单的逻辑和动态数据上。比如当温度在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
1条答案
按热度按时间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库检测到。