Flink中有哪些窗口?

16. Flink中有哪些窗口?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4049ni02-1631101071997)(C:\Users\宝富\Desktop\导师诊疗室第4次直播\1623370095187.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jPS5nC67-1631101071999)(C:\Users\宝富\Desktop\导师诊疗室第4次直播\1623370104997.png)]

Flink 支持两种划分窗口的方式,按照time和count。如果根据时间划分窗口,那么它就是一个time-window 如果根据数据划分窗口,那么它就是一个count-window。flink支持窗口的两个重要属性(size和interval)如果size=interval,那么就会形成tumbling-window(无重叠数据) 如果size>interval,那么就会形成sliding-window(有重叠数据) 如果size< interval, 那么这种窗口将会丢失数据。比如每5秒钟,统计过去3秒的通过路口汽车的数据,将会漏掉2秒钟的数据。通过组合可以得出四种基本窗口:

time-tumbling-window 无重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5))

time-sliding-window 有重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5), Time.seconds(3))

count-tumbling-window无重叠数据的数量窗口,设置方式举例:countWindow(5)

count-sliding-window 有重叠数据的数量窗口,设置方式举例:countWindow(5,3)

17. 说说Flink中的状态存储?

Flink在做计算的过程中经常需要存储中间状态,来避免数据丢失和状态恢复。选择的状态存储策略不同,会影响状态持久化如何和 checkpoint 交互。Flink提供了三种状态存储方式:MemoryStateBackend、FsStateBackend、RocksDBStateBackend。

18. Flink中的时间有哪几类

Flink 中的时间和其他流式计算系统的时间一样分为三类:事件时间,摄入时间,处理时间三种。如果以 EventTime 为基准来定义时间窗口将形成EventTimeWindow,要求消息本身就应该携带EventTime。如果以 IngesingtTime 为基准来定义时间窗口将形成 IngestingTimeWindow,以 source 的systemTime为准。如果以 ProcessingTime 基准来定义时间窗口将形成 ProcessingTimeWindow,以 operator 的systemTime 为准。

19. Flink 中水印是什么概念,起到什么作用?

Watermark 是 Apache Flink 为了处理 EventTime 窗口计算提出的一种机制, 本质上是一种时间戳。 一般来讲Watermark经常和Window一起被用来处理乱序事件。

20. Flink Table & SQL 熟悉吗?TableEnvironment这个类有什么作用

TableEnvironment是Table API和SQL集成的核心概念。这个类主要用来:

在内部catalog中注册表

注册外部catalog

执行SQL查询

注册用户定义(标量,表或聚合)函数

将DataStream或DataSet转换为表

持有对ExecutionEnvironment或StreamExecutionEnvironment的引用

21. Flink SQL的实现原理是什么?是如何实现 SQL 解析的呢?

首先大家要知道 Flink 的SQL解析是基于Apache Calcite这个开源框架。

基于此,一次完整的SQL解析过程如下:

用户使用对外提供Stream SQL的语法开发业务应用

用calcite对StreamSQL进行语法检验,语法检验通过后,转换成calcite的逻辑树节点;最终形成calcite的逻辑计划

采用Flink自定义的优化规则和calcite火山模型、启发式模型共同对逻辑树进行优化,生成最优的Flink物理计划

nk自定义的优化规则和calcite火山模型、启发式模型共同对逻辑树进行优化,生成最优的Flink物理计划

对物理计划采用janino codegen生成代码,生成用低阶API DataStream 描述的流应用,提交到Flink平台执行

请添加图片描述
请添加图片描述

Flink窗口可以将无界流切割成有限的“数据块”进行处理,按照同的分类方式,窗口有多种类型,以下介绍常见的窗口种类及其实现方式: ### 按驱动类型分类 #### 时间窗口 时间窗口以时间来驱动,是最常用的窗口类型。时间窗口又可以细分为滚动时间窗口、滑动时间窗口、会话窗口等。 - **滚动时间窗口(Tumbling Time Window)**: 滚动时间窗口有固定的大小,并且窗口之间会重叠。例如,设置一个大小为 5 秒的滚动时间窗口,每个窗口都会包含 5 秒内的数据。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; public class TumblingTimeWindowExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5); DataStream<Integer> result = stream .keyBy(value -> value % 2) // 按照奇偶性分组 .timeWindow(Time.seconds(5)) // 滚动时间窗口,大小为 5 秒 .sum(0); // 对窗口内的数据求和 result.print(); env.execute("Tumbling Time Window Example"); } } ``` - **滑动时间窗口(Sliding Time Window)**: 滑动时间窗口也有固定的大小,但是窗口之间可以重叠。通过设置滑动间隔,可以控制窗口滑动的频率。例如,设置一个大小为 5 秒,滑动间隔为 2 秒的滑动时间窗口,每 2 秒就会生成一个新的窗口。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.time.Time; public class SlidingTimeWindowExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5); DataStream<Integer> result = stream .keyBy(value -> value % 2) // 按照奇偶性分组 .timeWindow(Time.seconds(5), Time.seconds(2)) // 滑动时间窗口,大小为 5 秒,滑动间隔为 2 秒 .sum(0); // 对窗口内的数据求和 result.print(); env.execute("Sliding Time Window Example"); } } ``` - **会话窗口(Session Window)**: 会话窗口是由非活动间隙来定义的,即如果在一段时间内没有新的数据到来,就认为会话结束,窗口触发计算。例如,设置一个会话间隔为 5 秒的会话窗口,如果在 5 秒内没有新的数据到来,就会触发窗口计算。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.api.windowing.assigners.EventTimeSessionWindows; import org.apache.flink.streaming.api.windowing.time.Time; public class SessionWindowExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5); DataStream<Integer> result = stream .keyBy(value -> value % 2) // 按照奇偶性分组 .window(EventTimeSessionWindows.withGap(Time.seconds(5))) // 会话窗口,会话间隔为 5 秒 .sum(0); // 对窗口内的数据求和 result.print(); env.execute("Session Window Example"); } } ``` ### 按计数驱动分类 #### 滚动计数窗口(Tumbling Count Window) 滚动计数窗口根据元素的数量来划分窗口,每个窗口包含固定数量的元素。例如,设置一个大小为 5 的滚动计数窗口,每 5 个元素就会触发一次窗口计算。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class TumblingCountWindowExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); DataStream<Integer> result = stream .keyBy(value -> value % 2) // 按照奇偶性分组 .countWindow(5) // 滚动计数窗口,大小为 5 .sum(0); // 对窗口内的数据求和 result.print(); env.execute("Tumbling Count Window Example"); } } ``` #### 滑动计数窗口(Sliding Count Window) 滑动计数窗口同样根据元素的数量来划分窗口,但是窗口之间可以重叠。通过设置滑动间隔,可以控制窗口滑动的频率。例如,设置一个大小为 5,滑动间隔为 2 的滑动计数窗口,每 2 个元素就会生成一个新的窗口。 ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class SlidingCountWindowExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); DataStream<Integer> stream = env.fromElements(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); DataStream<Integer> result = stream .keyBy(value -> value % 2) // 按照奇偶性分组 .countWindow(5, 2) // 滑动计数窗口,大小为 5,滑动间隔为 2 .sum(0); // 对窗口内的数据求和 result.print(); env.execute("Sliding Count Window Example"); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值