0


Flink窗口与水位线

简介

Flink是一个分布式流处理框架,具有高性能、高可靠性和可扩展性。Flink支持实时和批处理,可以处理无限数据流和有限数据集。它提供了丰富的API和工具,可以方便地进行数据转换、聚合、过滤、窗口计算等操作。Flink还支持多种数据源和数据接收器,包括Kafka、HDFS、Elasticsearch等。Flink的运行模式包括本地模式和分布式模式,可以在各种环境中部署和运行。Flink已经被广泛应用于大数据分析、实时监控、智能推荐等领域。

核心概念

数据流(DataStreams)

Flink的数据处理基础是数据流,它是一种连续的、无限的数据集合。数据流可以是从文件、消息队列、套接字等数据源中获取的实时数据,也可以是有限的、批处理的数据集。Flink的DataStream API支持对数据流进行各种操作和转换。

窗口(Windows)

在流处理中,通常需要将数据按照时间或者其他维度进行切分,形成一个个的数据片段,这些数据片段就是窗口。Flink支持多种窗口类型,例如滚动窗口、滑动窗口、会话窗口等,可以根据需要选择合适的窗口类型进行数据处理。

时间(Time)

时间是Flink数据流处理中的重要概念,它用于对数据流进行切分、聚合、计算等操作。Flink支持多种时间类型,例如事件时间、处理时间、摄入时间等。

算子(Operators)

算子是Flink数据流处理中的基本操作单元,可以对数据流进行各种转换、聚合、过滤、连接等操作。Flink提供了多种算子,例如map、filter、reduce、join等。

状态(State)

状态是Flink数据流处理中的重要概念,它用于保存和更新数据流中的状态信息。例如,对于滑动窗口中的数据,需要保存前一段窗口的状态信息,以便进行增量计算。Flink支持多种状态类型,例如键值状态、列表状态、聚合状态等。

水位线

水位线概念

在Flink中,水位线是一种衡量Event Time进展的机制,用来处理实时数据中的乱序问题的,通常是水位线和窗口结合使用来实现。

从设备生成实时流事件,到Flink的source,再到多个oparator处理数据,过程中会受到网络延迟、背压等多种因素影响造成数据乱序。在进行窗口处理时,不可能无限期的等待延迟数据到达,当到达特定watermark时,认为在watermark之前的数据已经全部达到(即使后面还有延迟的数据), 可以触发窗口计算,这个机制就是 Watermark(水位线),具体如下图所示。

①作用:作为衡量事件时间进展的标记;

②产生:从数据中提取时间戳,作为水位线的时间戳;

③特征:广播到下游,确保所有并行子任务都可以及时更新事件时间,进行窗口计算

水位线分类

有序流

所有数据按照事件发生时间,依次进入流,遵循先来后到原则。从每条数据提取的时间戳由小到大。

乱序流

数据发生时间与进入流时的顺序不一致

内置Watermark的生成原理

1、都是周期生成的: 默认200ms

2、有序流:watermark = 当前最大事件时间 - 1ms

3、乱序流:watermark = 当前最大时间 - 延迟时间 - 1ms

水位线生成策略

有序流:WatermarkStrategy.forMonotonousTimestamps()

乱序流:WatermarkStrategy. forBoundedOutOfOrderness()

自定义:implements WatermarkGenerator

水位线的特性

  1. 水位线是插入到数据流中的一个标记,可以认为是一个特殊的数据
  2. 水位线主要的内容是一个时间戳,用来表示当前事件时间的进展
  3. 水位线是基于数据的时间戳生成
  4. 水位线的时间戳必须单调递增,以确保任务的事件时间时钟一直向前推进
  5. 水位线可以通过设置延迟,来保证正确处理乱序数据
  6. 一个水位线t,表示在当前流中事件时间已经达到了时间戳t,代表t之前的所有数据都到齐了,之后流中不会出现时间戳t’ <=t 的数据
  7. 水位线是Flink流处理中保证结果正确性的核心机制,它往往会跟窗口一起配合,完成堆乱序数据

多并行度水位线

上游并行子任务发来不同的水位线,当前任务会为每一个分区设置一个“分区水位线”(Partition Watermark),这是一个分区时钟;而当前任务自己的时钟,就是所有分区时钟里最小的那个

空闲等待方法:withIdleness()

窗口

窗口概念

将无限数据切割成有限的“数据块”进行处理,串口是处理无界流的核心。

窗口更像一个“桶”,将流切割成有限大小的多个存储桶,每个数据都会分发到对应的桶中,当到达窗口结束时间时,就对每个桶中收集的数据进行计算处理。

  • 动态创建:当有落在这个窗口区间范围的数据到达时,才创建对应的窗口
  • 窗口关闭:到达窗口结束时间时,窗口就触发计算并关闭

窗口驱动类型

  • 时间窗口

时间窗口以时间点到来定义窗口的开始(start)和结束(end),所以截取出的就是某一时间段的数据。到达时间时,窗口不再收集数据,触发计算输出结果,并将窗口关闭销毁。

窗口大小 = 结束时间 - 开始时间

  • 计数窗口(Count Window)

基于元素的个数来截取数据,到达固定的个数时就触发计算并关闭窗口。

计数窗口理解简单,只需指定窗口大小,就可以把数据分配到对应的窗口中,Flink内部对应的类来表示计数窗口,底层通过全局窗口(Global Window)实现

窗口分配规则类型

  • 滚动窗口(Tumbling Windows)

滚动窗口有固定的大小,是一种对数据进行“均匀切片”的划分方式,首尾相接。我们之前所举的例子都是滚动窗口,也正是因为滚动窗口无缝衔接,所以每个数据都会被分配到一个窗口,而且只会属于一个窗口。

滚动窗口可以基于时间定义,也可以基于数据个数定义;需要的参数只有窗口大小,我们可以定义一个长度为1小时的滚动时间窗口,那么每个小时就会进行一次统计;或者定义一个长度为10的滚动计数窗口,就会每10个数进行一次统计

例:

  • 每分钟页面浏览量
  • 滑动窗口(Sliding Windows)

滑动窗口的大小固定,但窗口之间不是首尾相接,而有部分重合。滑动窗口可以基于时间定义、数据个数。

定义滑动窗口的参数与两个:窗口大小,滑动步长。滑动步长是固定的,且代表了两个个窗口开始/结束的时间间隔。数据分配到多个窗口的个数 = 窗口大小/滑动步长

例:

  • 每10秒钟计算前1分钟的页面浏览量
  • SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
  • 会话窗口(Session Windows)

会话窗口只能基于时间来定义,“会话”终止的标志就是隔一段时间没有数据来。

size:两个会话窗口之间的最小距离。我们可以设置静态固定的size,也可以通过一个自定义的提取器(gap extractor)动态提取最小间隔gap的值。

在Flink底层,对会话窗口有比较特殊的处理:每来一个新的数据,都会创建一个新的会话窗口,然后判断已有窗口之间的距离,如果小于给定的size,就对它们进行合并操作。在Winodw算子中,对会话窗口有单独的处理逻辑。

会话窗口的长度不固定、起始和结束时间不确定,各个分区窗口之间没有任何关联。会话窗口之间一定是不会重叠的,且会留有至少为size的间隔

例:

  • 每个会话的网页浏览量,其中会话之间的间隔至少为30分钟
  • EventTimeSessionWindows.withGap(Time.minutes(30))
  • 全局窗口(Global Windows)

相同key的所有数据都分配到一个同一个窗口中;无界流的数据永无止境,窗口没有结束的时候,默认不做触发计算,如果希望对数据进行计算处理,还需要自定义“触发器”(Trigger)

窗口的生命周期

一个窗口在第一个属于它的元素到达时就会被创建,然后在时间(event 或 processing time) 超过窗口的“结束时间戳 + 用户定义的

allowed lateness

”时关闭删除

处理乱序、迟到数据的3个机制

乱序与迟到的区别
乱序:接收到的数据顺序和生成的数据的时间顺序不一致

迟到:超过了处理时间到达的数据
乱序迟到数据的处理机制
  1. watermark设置 乱序程度
  2. 窗口允许迟到(推迟关窗时间,再关窗之前,迟到数据来了仍然被计算,来一条计算一次,直至关窗)
  3. 侧输出流
疑问点

如果watermark等待3s,窗口允许迟到2s,为什么不直接watermark等待5s,或者窗口允许迟到5s

watermark设置太大会影响计算延迟

窗口允许迟到,是对大部分迟到数据的处理,让数据尽量准确

总结:在不影响计算时间的情况下,尽量保证数据的准确,修正数据
标签: flink 大数据

本文转载自: https://blog.csdn.net/qq_37254345/article/details/135887798
版权归原作者 热爱学习的成 所有, 如有侵权,请联系我们删除。

“Flink窗口与水位线”的评论:

还没有评论