一、Flink 的 Watermark(水位线 水印)
每隔3秒统计前3秒的元素个数,那么flink系统会事先在系统中划分好20(60/3)个window
制定watermark的策略: 周期性提取watermark,默认时间为200ms,我们可以认为在1号数据被分配到window之后的200ms,flink系统就开始计算水位线了
假设允许数据乱序的最大时间为10秒 数据开始流入flink系统
1号数据 01:01:22---hello
2号数据 01:01:35---flink
在此之后 又来一条数据(迟到) 3号数据 01:01:23---later
第一条数据流入 01:01:22---hello
这条数据的event time是01:01:22, 那么它将会被放置到[00:00:21-00:00:24)窗口内
(100ms后)此时水位线(Watermark)为 12 (22-10)
Watermark(12) < WindowEndTime(24) 所以 不会触发该window的计算
第二条数据流入 01:01:35---flink
这条数据的event time是01:01:35, 那么它会被放置在[00:00:33-00:00:36)窗口内
(100ms后)此时水位线(Watermark)为 25 (35-10)
由于Watermark(25) >= WindowEndTime(24), 所以 会触发水位线(25)之前window的计算, ([21, 24))
计算后窗口直接销毁
第三条数据流入 01:01:23---later
正常情况下数据应放到[00:00:21-00:00:24)窗口, 由于此窗口被销毁,所以数据被丢弃
为保证数据完整性,修改 AllowedLateness 为2s 也就是窗口触发计算后2s再销毁
(35-37流入)这条数据的event time是01:01:23,
那么它将会被放置到[00:00:21-00:00:24)窗口(此窗口在37时会被销毁)内
(100ms后)此时计算水位线: 23-10=13 < Watermark=25, 所以水位线不变仍为25
由于 Watermark(25) < WindowEndTime(24) + AllowedLateness(2),
所以 [00:00:21-00:00:24)窗口会再次(多次)触发
此时, 窗口销毁时机 Watermark >= WindowEndTime + AllowedLateness
二、Flink核心概念
参考链接(侵删): https://blog.csdn.net/believe2017slwx/article/details/79978244
1. Flink程序三个基本构建块
- source:数据源
- transformations:基于数据流的一组operate操作
- sink:数据处理结果的目的地
2. 并行数据流
- 在flink中,transformation是由一组operator组成,每一个operator被分割成operator subtask,同一个operator的多个 subtasks在不同的线程、不同的物理机或不同的容器中彼此互不依赖得并行执行。
- Stream在operator有两种形式
(1) One-to-one:类似于spark中的窄依赖
(2) Redistributing:类似于spark中的宽依赖
3. operator chains
- 出于分布式程序效率考虑,Flink将前后有依赖关系的一组operator的subtask链接在一起形成operator chains。operator chain在一个线程中执行,它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。链接的行为可以在编程API中进行指定
4. 窗口概念
flink可以基于窗口对在流上对数据进行聚合操作。flink支持的窗口有:
- 时间窗口(tumbing windows(滚动窗口 不重叠),sliding windows(滑动窗口 有重叠,session windows(有空隙的活动))
- 数据窗口(tumbing windows(滚动窗口 不重叠),sliding windows(滑动窗口 有重叠,session windows(有空隙的活动))
- 事件窗口
5. 时间概念
Stream中的记录时,记录中通常会包含各种典型的时间字段,Flink支持多种时间的处理:
- event Time(事件时间):表示事件创建时间
- Ingestion Time(摄取时间):表示事件进入到Flink Dataflow的时间(即流处理器第一次看到这个消息的时间)
- Processing Time(处理时间):表示某个Operator对事件进行处理事的本地系统时间(是在TaskManager节点上)