flink流式分析

时间语义

flink明确支持以下三种时间语义,如果想要使用事件时间,需要额外给flink提供一个时间戳提取器和Watermark生成器,flink使用它们来跟踪事件时间的进度

  • 事件时间:事件产生时间,数据中的记录的时间
  • 摄取时间:flink读取事件时的时间
  • 处理时间:具体算子处理事件的时间
Watermarks

watermarks的作用是定义何时停止等待较早的时间(乱序的事件流)

windows

windows的作用是将无界数据流分解成有界数据流做聚合分析

用 flink 计算窗口分析取决于两个主要的抽象操作:Window Assigners,将事件分配给窗口(根据需要创建新的窗口对象),以及 Window Functions,处理窗口内的数据

窗口分类

  • 滚动时间窗口
  • 滑动时间窗口
  • 滚动事件窗口
  • 滑动事件窗口
  • 会话窗口
  • 全局窗口

窗口应用函数

  • 批处理,ProcessWindowFunction 会缓存 Iterable 和窗口内容,供接下来全量计算
  • 流处理,每一次有事件被分配到窗口时,都会调用 ReduceFunction 或者 AggregateFunction 来增量计算
  • 两者结合,通过 ReduceFunction 或者 AggregateFunction 预聚合的增量计算结果在触发窗口时, 提供给 ProcessWindowFunction 做全量计算
晚到的事件

默认场景下,超过最大无序边界的事件会被删除,但我们有两个选择去控制这些事件

  1. 旁路输出
  2. 指定允许的延迟间隔,在这个间隔事件内,延迟的事件会继续分配给窗口
深入了解窗口操作
  • 滑动窗口是通过复制来实现的
  • 时间窗口会和时间对齐,一个小时的窗口,12:05开始运行,第一个窗口会在1:00关闭。滑动窗口和滚动窗口分配器所才用的offset参数可以改变窗口的对齐方式。
  • 窗口后面可以再接窗口
  • 事件触发窗口的创建,如果窗口内没有事件,就不会有窗口,也就不会输出结果