Time
无论离线还是实时处理数据时,尤其时实时处理数据中,时间是数据计算中非常重要的一种元素或维度,Flink中基于时间的流处理就是对有状态流处理的一种扩展,很多场景都是基于时间:
- 当进行时间序列分析
- 基于特定时间段(
通常称为窗口
)进行聚合 - 基于某事件发生时刻进行事件处理
- 判断数据流中的数据是否有延迟
三种时间
Flink的DataStream有大量基于Time的Operator,比如:基于时间的Windows,延迟数据处理等
Flin提供三种时间:
Event Time
: 事件发生的时间,指事件(数据)在其生产设备上产生时的时间,即在进入Flink之前就已经存在,可以从Event的字段中抽取,理想情况下,EventTime能让数据处理一定是准确的,能更好反映现实。
事件时间是根据事件实际发生的时间来定义的。在处理事件时间时,通常会从数据中提取事件时间戳,并基于这些时间戳来划分和计算窗口。
Processing Time
:处理消息的时间,指数据被相应Opertor执行时机器的系统时间
处理时间是 Flink 系统处理事件的时间,即事件进入 Flink 系统的时间。处理时间窗口是基于 Flink 系统时钟来定义和计算的。
Ingestion Time
: 进入到系统的时间,指数据进入到Flink的Source端时的系统时间。
三种时间比较
时间 | 优点 | 缺点 | 场景 |
---|---|---|---|
EventTime | 确定性好,即乱序,延时,或者数据重放等情况,都能给出正确的结果 | 处理无序事件时性能和延迟受到影响。 | 要求数据有延迟和乱序还要正确处理,即对结果要求极高 |
ProcessTime | 无需从Event中提取和解析,指定该Time形式时自动生成;性能和延迟都比EventTime好 | 不能处理无序事件和延迟数据。 | 对结果正确性要求不高的应用 |
IngestionTime | 无需指定,自动生成Time | 不能处理无序事件和延迟数据 | 一般少用 |
性能,延迟和正确性比较:
性能:ProcessingTime > IngestTime > EventTime
延迟:ProcessingTime < IngestTime < EventTime
正确性: EventTime > IngestTime >= ProcessingTime
注意
- 不同的时间语义有不同的应用场合
- 往往更关心事件时间(Event Time)
- Flink从1.12开始,默认使用EventTime。1.12之前默认使用Processtime。
Window
窗口是处理实时流的核心,它将无界流分割成有界流上进行计算
窗口场景
- 做最近一段时间,每隔一段时间,最近多少条数据等的统计
- 实时计算结果对实时性要求不高,也可以使用窗口
- 数据乱序,延迟等处理使用窗口
窗口分类
Flink的窗口支持时间驱动和技术驱动
- 时间窗口(
Time Window
):按照时间生成Window- 滚动时间窗口(
Tumbling Window
) - 滑动时间窗口(
Sliding Window
) - 会话窗口 (
Session Window
)
- 滚动时间窗口(
- 计数窗口(Count Window):按照指定的数据条数生成一个Window,与时间无关
- 滚动计数窗口
- 滑动计数窗口
- 全局窗口(Global Windows):只支持自定义触发器才生效
注意
- 窗口范围都是左包右不包