“ 上一文中介绍了Flink的Datastream API的主要功能,本文以电商用户行为实时统计分析应用场景说明Flink的Datastream API的核心API的功能,主要包含窗口操作和状态操作。”
在Flink 的 Datastream API 中,核心API是数据转换算子,而最常用的是API是窗口操作和状态操作,
而窗口操作类型分为:
1)时间窗口:滚动时间窗口、滑动时间窗口、会话时间窗口
2)计数窗口:滚动计数窗口、滑动计数窗口
状态操作主要包含算子状态和键控状态,常用的是算子状态,算子状态配合窗口操作完成指标的统计。这样描述会比较抽象,下面结合实际应用场景来说明API的使用方法。
01
—
滚动时间窗口聚合
我们常见的电商用户行为的流量统计即为实时统计,如下图所示,整体的统计逻辑:

这里数据分析界面展示的是每小时的访问量pv和uv,数据源是APP端的用户访问埋点日志。
这里详细说明一下滚动窗口的统计逻辑:

这里的滚动的时间间隔比如从ODS层统计进入到DW层每5分钟统计一次,这个就是5分钟的时间间隔,那么这个window size就是5分钟。同理,从DW统计到DM层的每小时的时间间隔,则window size 就是 1 小时。
这里说明一下为什么最终需求展示的是每小时的PV和UV ,为什么中间会新增一层每5分钟的统计,这个是数据建模里面的常见的,基础数据的统计尽量做到最小颗粒度,以免上层应用的统计周期变化导致底层的统计代码改变,例如应用有一天说每小时的PV和UV 统计粒度太粗了,需要细化到每半小时统计一次,这个时候,从ODS到DW的统计代码不需要改变了。这也是数据分层的好处。应对上层的需求的变化。
02
—
滑动时间窗口聚合
而在实时统计中,我们还想看看哪些客户端在某一个时间范围访问的情况以及更新频次,例如:

滑动窗口的统计逻辑如下:

它的统计逻辑是统计的时间范围是每分钟,即为窗口长度,统计的频次为滑动的距离。
03
—
会话时间窗口聚合
会话时间窗口主要使用窗口分配器通过会话活动来对元素进行分组,会话窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况,相反,当它在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关闭。

应用场景主要应用于例如详细的用户行为监测,例如用户活跃时间范围等
计数窗口和时间窗口的逻辑类似,主要区别不是以时间为窗口,以计数次数为窗口。
下面介绍算子状态说明状态在Flink 实时处理中的主要作用,在Flink实时开发中,状态(State)指的是用于保存和管理数据处理过程中的中间和输出结果的一种机制。在流式计算中,由于数据是连续不断地流入和处理的,每个事件的处理可能需要依赖前面事件的信息或结果。而状态的引入可以帮助保存和跟踪这些信息和结果,使得计算过程具有一定的记忆能力。即状态是将当前的计算缓存在本地的一种机制,便于下次数据处理将累计值获取到进行后续处理。
04
—
算子状态
在累积统计,例如每五分钟的平均值,最大值,最小值等这种统计场景会使用到状态,如下所示应用场景:

例如设备的温度传感器每10秒钟检查一下管道的温度,将温度打印日志,日志采集之后存储到kafka 中,flink 消费日志,将检测的设备温度处理成规范的数据存储到ODS的层,ODS将新增数据抛出到kafka,flink 统计每五分钟的温度的平均值,那如果需要统计平均值,则在每五分钟的开始需要记录第一个温度值,以及次数,然后将温度累加,次数累计,到五分钟结束的时候,用温度总和除以次数总和求的每五分钟的平均值,这里温度累加,次数累加即是状态,状态包含(温度、次数),每一次的状态累加。求的的每五分钟的平均温度写入DW层。然后,DW层的数据将变化写入kafka,然后flink监控到数据后,将每五分钟的平均温度是否超过40度进行判断,同时使用状态缓存,状态大于40度,则累加1,不大于40度,则累加0,然后,统计窗口计为1小时,这样得到每小时的中温度超过40度的次数,写入到DM层记录,在DM层的上的应用,通过判断当前的次数即可马上知道是否需要告警。这也是窗口API和状态一起完成的一种应用场景。
05
—
键控状态
在 Flink中,键控状态(Keyed State)是指根据数据流中的键(key)来进行状态管理和操作的一种状态类型。每个键都会有对应的状态,因此不同键的状态是相互隔离的。 键控状态在Flink中的应用场景非常广泛,下面列举几个常见的例子:
1、实时聚合:通过键控状态可以方便地对数据流进行实时聚合操作,例如实时计算每个用户的累计消费金额、每个商品的库存情况等。
2、状态分割:通过键控状态可以将数据流进行分割,每个键对应独立的状态,实现基于不同键的不同逻辑处理。例如,对于用户ID作为键,可以统计不同用户的行为特征。
3、数据关联:通过键控状态可以实现数据之间的关联操作,例如根据用户ID将用户行为数据和用户基本信息进行关联,从而进行更丰富的分析。
4、有限状态机:通过键控状态可以实现有限状态机的建模。例如,在订单处理中,可以使用键控状态来跟踪订单状态的不同转换阶段。
总的来说,键控状态提供了一种在流处理中对基于键进行灵活管理和操作的机制,可以帮助实现更复杂的实时计算和数据分析任务。Flink的键控状态是其强大的状态管理能力的核心组成部分。