Flink原理学习(六)窗口和时间

Flink原理学习之 窗口和时间


文章目录

  • Flink原理学习之 窗口和时间
  • 一、Flink的时间类型
  • 二、Watermark
  • 三、Flink窗口机制


Java、大数据开发学习要点(持续更新中…)


一、Flink的时间类型

Flink的时间语义分为三种:
Flink原理学习(六)窗口和时间_第1张图片

  • Event Time:即事件时间,是事件真正发生的时间,一旦确定就不会发生变化。它通常由事件中的时间戳描述,例如采集的日志数据中,每一条日志都会记录自己的生成时间,Flink通过时间戳分配器访问事件时间戳。
  • Processing Time:即处理时间,是每一个执行基于时间操作的算子的本地系统时间,与机器相关,因此多次执行结果会不同,默认的时间属性就是Processing Time。
  • Ingestion Time:即摄取时间,是数据进入Flink的时间。摄取时间也无法避免Flink异常重启后数据处理的不准确问题。

一般来说Event Time才是事件真正的时间,也是Flink最大的特点之一,一般业务都是使用事件时间。像Processing Time,会产生多次计算结果不同的问题,也会因为数据延迟到达服务端而产生统计不准确的问题(Spark Streaming就是使用Processing Time)。

二、Watermark

  Watermark用于在EventTime下处理乱序事件,而正确处理乱序事件,通常通过Watermark和窗口来实现。乱序是由于网络、分布式等原因产生的,而乱序不经处理则会影响窗口数据统计的准确性。
  Watermark也可以理解成一个延迟触发机制,我们可以设置Watermark的延时时长t,每次系统会校验已经到达的数据中最大的maxEventTime,然后认定eventTime小于maxEventTime - t的所有数据都已经到达(实际是否真到了并不知道)如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行
  Watermark是Source通过一定策略(一般选择周期性)插入数据流并向下传递的。Watermark = maxEventTime - 最大延迟时间,一旦Watermark大于窗口结束时间,触发窗口计算的执行。由此可见,Watermark在数据流中是非减的。而如果出现Group By、Union等多个数据流汇集的算子,产生了多个Watermark汇集的情况,为了保证Watermark的递增和数据的完整性,那么该算子会保留最小的Watermark,并发送给下游。

三、Flink窗口机制

  流式计算是一种被设计用于处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而Window是一种切割无限数据为有限块进行处理的手段。Window将一个无限的流拆分成有限大小的buckets,我们可以在这些桶上做计算操作

Window可以分成两类:

  • CountWindow:按照指定的数据条数生成一个Window,与时间无关。
  • TimeWindow:按照时间生成Window【可以根据窗口实现原理的不同分成三类:滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)】
    • 滚动窗口:时间对齐,窗口长度固定,没有重叠
    • 滑动窗口:时间对齐,窗口长度固定,可以有重叠,在这种情况下同一个元素可能会被分配到多个窗口中。
    • 会话窗口:时间无对齐,一个窗口在一段时间未接受到数据后将会关闭,下次数据到来则开启一个新的窗口。(类似会话机制)

Window Function 定义了要对窗口中收集的数据做的计算操作,主要可以分为两类:

  • 增量聚合函数
    每条数据到来就进行计算,保存一个简单的状态。典型的增量聚合函数有ReduceFunction, AggregateFunction。

  • 全窗口函数
    先把窗口所有数据收集起来,等到计算的时候会遍历所有数据。ProcessWindowFunction就是一个全窗口函数。

      由上可知,窗口的数据都是保存在状态中的,并且窗口的容错机制靠状态的checkpoint机制实现。
    

你可能感兴趣的:(大数据相关,flink,大数据)