前言:
参考极客时间 Flink核心技术与实战
一、flink时间概念
1. flink时间分类
event time:事件时间
storage time: 时间接入消息中间件的时间
ingestion time:数据接入flink系统的时间
processing time:数据transform过程中的时间
2. processing time:
定义:基于机器本地的时间
特点:统计结果可能不固定,具有不可复现性
3. event time:
定义:事件发生的先后关系
特点:可复现
4. stream中设置时间语义:
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
// 该方法Deprecated, 默认为 event time
二、watermark
1. flink基于event time的处理流程:
a. 获取streamElement 的 eventTime 时间戳
b. 接入的数据何时可以触发统计计算(watermark)
2. watermark:
作用:标记event-time 前进过程,表明所有较早的事件已经到达,用以解决乱序和延时问题
特点:watermark随着event-time变动,并自身携带timestamp
场景:
a. 有界乱序事件下的watermark
要求:event不可完全无序,应当仅具有一定无序性,即maxOutOfOrderness不能无限大
此时,watermark中的时间戳=事件最大时间戳-maxOutOutOfOrderness
b. 并行系统中的watermark
特点:
- 事件的标识:key+时间戳
- 每个算子有自己的时钟
- watermark是一种特殊的事件,会随着数据处理流程发送到下游的算子
- 当watermark发送给下游算子后,会更新下游算子时间戳
三、watermark与window的联系
- watermark=Max event time- lateThreshold
- late Threshold越高,数据处理延时越高
- 窗口触发条件:current watermark > window endtime
- watermark 主要目的是告诉窗口不会有比当前watermark更晚的数据到达
- idel watermark仅会发生在顺序事件中
idel watermark(图中虚线,理想的watermark):
四、在flink中定义watermark
1. 分类:
periodic watermark: 基于event time产生,使用event time - 延迟产生
punctuated watermark: 基于固定事件产生