- 1. window 概念
- 1.1 为什么要有窗口
- 1.2 什么叫窗口
- 1.3 开窗的原理
- 2. window 类型
- 2.1 时间窗口
- 2.2 计数窗口(根据窗口中key的个数来开窗)
- 3. window API
- 3.1 怎么新建窗口
- 3.2 窗口聚合函数
- 3.3 其它可选 API
- 4. Flink中的时间语义
- 4.1 Flink中的时间语义有哪些?
- 4.2 Flink中哪些时间比较重要呢?
- 4.3 设置Event Time
- 4.4 如果按照事件发生的时间作为时间窗口 处理数据 会有什么问题?
- 4.5 为了解决迟到数据 引入了watermark的概念
- 4.6 watermark 就一定能保证延迟的数据不影响最终结果吗?
- 4.5
- 4.6 watermark的特点
- 4.7 watermark的传递
- 1.1 为什么要有窗口
-
实时流是源源不断的进行处理,为了得到一段流的处理后结果,此时就要把无限流转为有界流,此时Flink引入了窗口的概念。
- 1.2 什么叫窗口
-
实时流上截取的一段流 就叫一个窗口
- 1.3 开窗的原理
-
将流数据发到有限大小的桶中进行分析.例如每小时的数据开窗,8~9的数据为一个桶 ,9~10点的数据为一个桶。那么8~9的数据来了 那么就会放在8~9的桶中。
- 2.1 时间窗口
- 滚动时间窗口
- 窗口长度固定 且连续 不可以有重叠
- 滑动时间窗口
- 窗口长度固定 可以有重叠
- 会话窗口
- 一段时间没有接受到新数据 就会生成新的窗口 时间无对其
- 滚动时间窗口
- 2.2 计数窗口(根据窗口中key的个数来开窗)
- 滚动计数窗口
- 滑动计数窗口
- 3.1 怎么新建窗口
- keyBy() 之后通过timeWindows 和 countWindow方法 定义时间窗口和计数窗口
- 3.2 窗口聚合函数
- 增量聚合函数
- 每条数据到来就进行计算,保存一个中间聚合状态,等到窗口结束 输出结果
ReduceFunction AggreateFunction minBy maxBy 等
- 全窗口函数
- 先把窗口所有的数据收集起来,等到计算的时候遍历所有数据
ProcessWindownFunction windowFunction
- 增量聚合函数
- 3.3 其它可选 API
- trigger() —— 触发器
定义 window 什么时候关闭,触发计算并输出结果 - evitor() —— 移除器
定义移除某些数据的逻辑 - allowedLateness() —— 允许处理迟到的数据
- sideOutputLateData() —— 将迟到的数据放入侧输出流
- getSideOutput() —— 获取侧输出流
- 4.1 Flink中的时间语义有哪些?
- 在 Flink 的流式处理中,会涉及到时间的不同概念
- Event time 事件发生时间
- Ingestion time 进入Flink系统的时候
- Processing time 处理时间
- 在 Flink 的流式处理中,会涉及到时间的不同概念
- 4.2 Flink中哪些时间比较重要呢?
- 在 Flink 的流式处理中,绝大部分的业务都会使用 eventTime,一般只在
eventTime 无法使用时,才会被迫使用 ProcessingTime 或者 IngestionTime。
- 在 Flink 的流式处理中,绝大部分的业务都会使用 eventTime,一般只在
- 4.3 设置Event Time
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment // 从调用时刻开始给 env 创建的每一个 stream 追加时间特征 env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
- 4.4 如果按照事件发生的时间作为时间窗口 处理数据 会有什么问题?
数据在网络中分布式传输 可能由于先发送的事件后到,所以在处理数据的时候可能会丢或者处理多余数据。例如一下图 以事件发生时间5s开一个窗口, 事件时间是5s的时候 准备关闭窗口 输出结果时,但是由于网络传输的原因 3 和2 的数据还没有接受。此时关闭窗口 那么就2 和 3 的窗口就不会被处理。
- 4.5 为了解决迟到数据 引入了watermark的概念
- 设置一个延迟触发时间 watemark 每次系统会校验已经到达的数据中最大的 maxEventTime,然后认定 eventTime小于 maxEventTime - t 的所有数据都已经到达,如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行。
- 4.6 watermark 就一定能保证延迟的数据不影响最终结果吗?
假如窗口已经关闭了 此时又来了 属于该窗口的数据,那么此时数据将被丢弃掉 印象最终的结果。为了解决这种问题,所以可设置窗口延迟关闭时间,当窗户到达设置的窗口时间大小后,输出结果 但是并不关闭窗口,在一定的延迟时间内,如果有该窗口的数据 每来一条 处理一条。如果没有延迟窗口没有兜住,那么就将结果扔到侧输出流中.
- 4.5
- 设置一个一延迟触发时间 watemark 每次系统会校验已经到达的数据中最大的 maxEventTime,然后认定 eventTime小于 maxEventTime - t 的所有数据都已经到达,如果有窗口的停止时间等于maxEventTime – t,那么这个窗口被触发执行。
- 4.6 watermark的特点
- watermark 必须单调递增,以确保任务的事件时间时钟在向前推进,而不是在后退
- watermark 与数据的时间戳相关
- 4.7 watermark的传递
- 取当前分区中 最小的watermark广播给下游



