Time
Flink 时间语义
Flink 的三种时间语义
Processing Time
:事件被处理时机器的系统时间Event Time
:事件自身的时间Ingestion Time
:事件进入 Flink 的时间
Process Time
事件处理时间 即事件被处理时机器的系统时间
特点
- 最简单的
Time
概念 - 最好的性能和最低的延迟
- 分布式和异步环境下,不能提供确定性(不能保证结果数据的准确性)
- 容易受到事件到达系统的速度 (如消息队列)、事件在系统内操作流动的速度和中断的影响
Event Time
事件自身的时间,一般就是数据本身携带的时间
特点
- 数据本身携带,时间取决于数据
- 事件到达
Flink
之前就已经确定 - 必须指定如何生成 WaterMarks,用来表示
Event Time
进度的机制 - 无论事件什么时候到达或者其怎么排序,最后处理
Event Time
将产生完全一致和确定的结果
Ingestion Time
事件进入 Flink 的时间
在数据源操作处(进入 Flink source 时),每个事件将进入 Flink 时当时的时间作为时间戳
特点
- 事件在进入数据源(Flink Source)时的时间作为时间戳
- 介于
Event Time
和Processing Time
之间
Flink Time 使用场景
Time 的使用场景
一般来说在生产环境中使用 Processing Time
和 Event Time
比较多,Ingestion Time
一般用的较少
Processing Time 使用场景
Processing Time 使用场景
- 用户不关心事件时间,只关心这个时间窗口要有数据进来
Processing Time 的几种应用场景举例
- 淘宝双十一晚会大屏幕的下单总金额
Event Time 使用场景
Event Time 使用场景
- 业务需求需要时间这个字段
Event Time 的几种应用场景举例
- 购物时先有下单事件、再有支付事件
- 机器异常检测出发的警告也需要具体的事件展示出来
- 商品广告及时精准推荐给用户依赖的就是用户在浏览器的时间段 / 频率 / 时长等信息
处理延迟的数据
可能出现的情况影响事件到达不一定及时、乱序、延迟
- 网络抖动
- 服务可用性
- 消息队列的分区数据堆积
但是使用事件时间的话,就可能有这样的情况:数据源采集的数据往消息队列中发送时可能因为网络抖动、服务可用性、消息队列的分区数据堆积的影响而导致数据到达的不一定及时,可能会出现数据出现一定的乱序、延迟几分钟等,庆幸的是 Flink 支持通过 WaterMark 机制来处理这种延迟的数据
如何设置 Time 策略?
val env = StreamExecutionEnvironment.getExecutionEnvironment |