流计算中的window计算 | 青训营笔记

237 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第4天.

image.png

课程内容

01.实时计算和批式计算的本质区别

02.实时计算中的核心功能

03.三大基本窗口类型的定义、使用以及核心原理

04.窗口机制中的最核心的优化及其原理

05.实例讲解

01.流式计算与批式计算的对比

image.png 处理时间窗口实现数据的实时流动: image.png

处理时间:数据在流式计算系统中真正处理时所在机器的当前时间

事件时间:数据产生的时间点,比如客户端,传感器,后端代码等上报数据时的时间。

理想情况下,事件时间应该等于处理时间,实际上处理时间会晚于事件时间: image.jpeg 引入Watermark机制解决因为数据延迟产生乱序输入的问题

Watermark:表示系统认为的当前真实的事件时间

image.png 为什么Watermark需要传递?

如何传递Watermark?取上游所有subtask的最小值。

image (5).png 可以通过 Flink UI 观察 Watermark 是否正常,如何观察?

image.png

Watermark如果有部分数据断流,而又要等到了所有的数据才能进行下一个阶段,则断流的部分采用Idle Source的方法,将其作为理想值传递给下游,下游处理时不考虑所有的Idle Source。

当有迟到数据时:Window算子默认丢弃迟到数据,Join算子如果是双流join并且是outer join,则认为它不能join到任何数据

02. Window

1. 基本功能

window的分类:

①Tumble Window(滚动窗口)

②Sliding Window(滑动窗口)

③Session Window(会话窗口)

④其他窗口

1.1 滚动窗口

image (6).png 窗口的划分:

①每个key单独划分 (window按照时间划分,每个user对应的每个窗口是一个相对独立的区域,图中一共有15个独立的区域)有滚动时间

②每条数据只会属于一个窗口

窗口的触发:在window结束时间到达的时候一次性触发

1.2 滑动窗口

image (8).png

窗口划分:

①每个key单独划分

②每条数据可能会属于多个窗口,因为滑动窗口的窗口可重叠。

窗口触发:Window结束时间到达的时候一次性触发,和滚动窗口一样。

1.3 会话窗口

image (9).png 窗口划分: ①每个key单独划分;窗口划分是一个动态的过程

②每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge(动态合并);

2. window的使用

image.png

迟到数据处理:

迟到的定义:不同场景定义的迟到不一样,一般来说数据晚于watermark就算是迟到。但在window中的标准可以划分得宽松一些,晚于watermark但是数据到达之前window尚未触发,则该数据不算迟到。

产生迟到数据的情况:只有事件时间下才会有迟到数据。

迟到数据的默认处理:丢弃

方法①:Allow lateness

设置一个允许迟到的时间。设置之后,窗口正常计算结束后,不会马上清理状态,而是会多保留allowLateness这么长时间,在这段时间内如果还有数据到来,则继续之前的状态进行计算(修正的过程)。

适用于:DataStream、SQL

方法②:SideOutput(侧输出流)

需要对迟到数据打一个tag,然后在DataStream上根据这个tag获取到迟到的数据流,在业务层可自行选择处理。

适用于:DataStream

3. 窗口计算的模型

1)增量计算

每条数据到来直接计算,window只存储计算结果。典型的reduce、aggregate等函数都是增量计算。SQL中的聚合只有增量计算。

2)全量计算 每条数据到来时先缓存,等到window触发计算的时候计算所有的数据。典型的process函数就是全量计算。

4. EMIT触发

定义:EMIT输出指的是,在window没有结束的时候,提前把window计算的部分结果输出出来。

实现:

在DataStream里可以通过自定义Trigger来实现,Trigger的结果可以是:

image.png

SQL也可以使用,通过配置:

image.png

03. 高级优化

1)Mini-batch 优化

image.png 2)倾斜优化-local-global

image.png 3)Distinct计算状态复用

image.png

image (10).png 4)Pane优化

image.png

image.png

04.案例分析

image.png

image.png

image.png

image.png