今日目标是深入了解flink的高级api,包括flink的四大基石、窗口操作、时间和水印机制以及状态管理。本文将详细介绍这些关键概念和相关操作,帮助你掌握flink的核心功能。
Flink的四大基石
Flink的四大基石包括:
-
Checkpoint – 检查点:用于实现分布式一致性,解决数据丢失问题,支持故障恢复。检查点存储的是全局状态,并持久化在HDFS分布式文件系统中。
-
State – 状态:分为托管状态(Managed State)和原始状态(Raw State)。从数据结构的角度来看,托管状态包括ValueState、ListState、MapState和BroadcastState。
-
Time – 时间:分为事件时间(EventTime)、摄取时间(IngestionTime)和处理时间(ProcessTime)。
-
Window – 窗口:用于将无界数据转换为有界数据,支持时间窗口和计数窗口,包括滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)。
窗口操作
窗口操作是Flink处理流数据的关键功能之一。窗口的作用是将动态、无界的数据划定范围,转换为有界、静态的数据进行计算。
为什么需要窗口?
- 数据是动态的、无界的,需要窗口来划定范围,将无界数据转换成有界、静态的数据进行计算。
窗口分类:
-
时间窗口(Time Window):基于时间进行分类,常见的窗口级别包括一天、一小时、一分钟等。
- 滚动窗口(Tumbling Window):窗口时间和滑动时间相同。
- 滑动窗口(Sliding Window):滑动时间小于窗口时间,窗口会重叠。
- 会话窗口(Session Window):基于会话进行分类。
-
计数窗口(Count Window):基于计数进行分类。
- 滚动计数窗口:每达到一定数量进行统计。
- 滑动计数窗口:每达到一定数量进行统计,但窗口会重叠。
如何使用窗口?
时间窗口案例:
-
需求1:每5秒钟统计一次,最近5秒钟内,各个路口通过红绿灯汽车的数量(基于时间的滚动窗口)。
-
需求2:每5秒钟统计一次,最近10秒钟内,各个路口通过红绿灯汽车的数量(基于时间的滑动窗口)。
}
计数窗口案例:
-
需求1:统计在最近5条消息中,各自路口通过的汽车数量,相同的key每出现5次进行统计(基于数量的滚动窗口)。
-
需求2:统计在最近5条消息中,各自路口通过的汽车数量,相同的key每出现3次进行统计(基于数量的滑动窗口)。
}
Flink时间 – Time 和水印 – Watermark
时间(Time):
水印机制(Watermark):
水印机制主要用于解决数据延迟和数据乱序问题。水印(时间戳)等于事件时间减去允许的最大延迟时间。窗口触发的条件是水印时间大于等于窗口的结束时间。
需求:
有订单数据,格式为:(订单ID,用户ID,时间戳/事件时间,订单金额)。要求每隔5秒计算5秒内每个用户的订单总金额,并添加Watermark来解决一定程度上的数据延迟和数据乱序(最多延时3秒)问题。
}
自定义重写接口实现水印机制:
}
Flink状态管理
状态是基于key或操作算子的中间结果。Flink的状态分为两种:托管状态(Managed State)和原始状态(Raw State)。托管状态又分为基于key的状态(Keyed State)和基于操作的状态(Operator State)。
Keyed State支持的数据结构包括:
- ValueState
- ListState
- MapState
- BroadcastState
Operator State支持的数据结构包括:
- 字节数组
- ListState
Flink Keyed State 案例:
Flink Operator State 案例:
通过以上详细介绍和代码示例,你应该能够更好地理解和应用Flink的高级API,掌握窗口操作、时间和水印机制以及状态管理等关键概念。