每隔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节点上)