Flink中的时间和窗口

Flink中的时间和窗口

在传统的批处理系统中,我们可以等到一批数据全部都到齐了之后,对其做相关的计算;但是在实时处理系统中,数据是源源不断的,正常情况下,我们就得来一条处理一条。那么,我们应该如何统计某个实时数据源中最近一段时间内的数据呢?

在Flink的观念中,引入了"窗口"的概念。所谓的"窗口",一般就是划定的一段时间范围,也就是"时间窗";对在这范围内的数据进行处理,就是所谓的窗口计算。所以窗口和时间往往是分不开的。

一、窗口(Window)

1.正确的理解窗口

简单来说,Flink是一个流式计算引擎,主要用来处理无界数据流的,数据源源不断、无穷无尽,想要方便高效的处理这种无界数据流,一种方式就是将这种无界数据划分为多个有界的"数据块",这其实就是窗口(Window)。

Flink中的窗口并不是提前创建好了的,而是动态创建的,当有落在这个窗口区间范围 的数据达到时,才创建对应的窗口。另外,这里我们认为到达窗口结束时间时,窗口就触发计算并关闭,事实上"触发计算"和"窗口关闭"两个行为也可以分开。

2.窗口的分类

1)按照驱动类型分

窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息其实就是"怎样截取数据"。换句话说, 就是以什么标准来开始和结束数据的截取,我们把它叫作窗口的"驱动类型"。
(1)时间窗口(Time Window)

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

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

通过上面的图我们可以看到,时间窗口的时间固定,计数窗口的计数固定。

其实,到这里,我们可以进一步正确的理解窗口,在Flink中,窗口其实并不是一个"框",它更加像一个"桶",在Flink中,窗口可以把流切割为有限大小的多个"存储桶"(bucket),流中的每一个数据都会进入到对应的桶中,当窗口的结束时间到达时,就会关闭桶并且对桶中的数据进行收集计算,也就是所谓的窗口计算。
2)按照窗口分配数据的规则分类

根据分配数据的规则,窗口的具体实现可以分为 4 类:滚动窗口(Tumbling Window)、 滑动窗口(Sliding Window)、会话窗口(Session Window),以及全局窗口(Global Window)。
滚动窗口(Tumbling Window)

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

可以看出,滚动窗口的应用非常广泛,它可以对每个时间段的数据做统计计算。

滑动窗口(Sliding Window)

滑动窗口的大小也是固定的。但是窗口之间并不是首尾相接的,而是可以"错开"一定的位置。 定义滑动窗口的参数有两个:除去窗口大小(window size)之外,还有一个"滑动步长"(window slide), 它其实就代表了窗口计算的频率。窗口在结束时间触发计算输出结果,那么滑动步长就代表了计算频率。

当滑动步长小于窗口大小时,滑动窗口就会出现重叠, 这时数据也可能会被同时分配 到多个窗口中。而具体的个数, 就由窗口大小和滑动步长的比 值(size/slide)来决定。 滚动窗口也可以看作是一 种特殊的滑动窗口------窗口大小等于滑动步长(size = slide)。 滑动窗口适合计算结果更新 频率非常高的场景。

相比滚动窗口而言,滚动窗口可以做每个时间段的计算,滑动窗口就更适合做最近一个时间段的计算。

会话窗口(Session Window)

会话窗口,是基于"会话"(session)来来对数据进行分组的。会话窗口只能基于时间来定义。 会话窗口中,最重要的参数就是会话的超时时间,也就是两个会话窗口之间的最小距离。如果相邻两个数据到来的时间间隔(Gap)小于指定的大小(size),那说明还在保持会话,它们就属于同一个窗口;如果gap大于size, 那么新来的数据就应该属于新的会话窗口,而前一个窗口就应该关闭了。

会话窗口的长度不固定, 起始和结束时间也是不确定 的,各个分区之间窗口没有 任何关联。会话窗口之间一 定是不会重叠的,而且会留 有至少为size的间隔(session gap)。在一些类似保持会话的场 景下,可以使用会话窗口来进 行数据的处理统计。

全局窗口(Global Windows)

"全局窗口",这种窗口全局有效,会把相同key的所有数据都分配到同一个窗口中。这种窗口没有结束的时候, 默认是不会做触发计算的。如果希望它能对数据进行计算处理,还需要自定义"触发器"(Trigger)。

全局窗口没有结束的 时间点,所以一般在希望 做更加灵活的窗口处理时 自定义使用。Flink中的计数窗口(Count Window), 底层就是用全局窗口实现的。

二、时间语义

到底是以那种时间作为衡量标准,就是所谓的"时间语义"。

在实际应用中,事件时间语义会更为常见。一般情况下,业务日志数据中都会记录数据生成的时间戳(timestamp),它就可以作为事件时间的判断基础。 在 Flink 中,由于处理时间比较简单,早期版本默认的时间语义是处理时间;而考虑到事件时间在实际应用中更为广泛,从 Flink1.12 版本开始,Flink 已经将事件时间作为默认的时间语义了。

相关推荐
lzhlizihang38 分钟前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
Tianyanxiao41 分钟前
如何利用探商宝精准营销,抓住行业机遇——以AI技术与大数据推动企业信息精准筛选
大数据·人工智能·科技·数据分析·深度优先·零售
大数据编程之光43 分钟前
Hive 查询各类型专利 top10 申请人及专利申请数
大数据·数据仓库·hive·hadoop
GDDGHS_1 小时前
大数据工具 flume 的安装配置与使用 (详细版)
大数据·flume
Acrelhuang2 小时前
安科瑞5G基站直流叠光监控系统-安科瑞黄安南
大数据·数据库·数据仓库·物联网
皓7412 小时前
服饰电商行业知识管理的创新实践与知识中台的重要性
大数据·人工智能·科技·数据分析·零售
Mephisto.java3 小时前
【大数据学习 | kafka高级部分】kafka的kraft集群
大数据·sql·oracle·kafka·json·hbase
Mephisto.java3 小时前
【大数据学习 | kafka高级部分】kafka的文件存储原理
大数据·sql·oracle·kafka·json
W Y3 小时前
【架构-37】Spark和Flink
架构·flink·spark
ycsdn103 小时前
Caused by: org.apache.flink.api.common.io.ParseException: Row too short:
大数据·flink