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

74 阅读2分钟

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

此次内容是在之前Flink上进行的拓展,学习Flink之后更好地理解了流计算,本节介绍流计算中的window及其优化。

一、概述

批处理典型的数仓架构为T+1架构,计算是时天级别。

实时计算分为处理时间和事件时间。

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

事件时间:事件产生时间

在数据中插入一些watermark,表示当前的真实时间。在数据存在乱序时,它可以用来在乱序容忍和实时性之间做取舍。

二、Watermark

生成方式:

Per-subtask watermark生成

Per-partition watermark 生成

存在问题:

部分partition/subtask断流

解决方案:Idle source

当断流超过配置的idle超时时间,把当前subtask设置idle,发给下游,下游计算watermark时忽略此subtask。

迟到数据处理:

算子自身决定如何处理迟到数据:

Window聚合,默认丢弃

join算子认为跟之前的join不到

三、Window

1.基本功能

分类:Tumble/Sliding/Session/全局/累计...

①滚动窗口:每个key单独划分;每条数据只会属于一个窗口

Window结束时间到达的时候一次性触发

②滑动窗口:每个key单独划分;每条数据可能属于一个窗口

Window结束时间到达的时候一次性触发

③会话窗口:每个key单独划分;每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge

Window结束时间到达的时候一次性触发

 

迟到:划分的window end比当前的watermark值还小

只有事件时间下才会有迟到的数据。

除了丢弃之外,还可以用以下方法处理:

(1)Allow lateness:设置一个允许迟到时间,窗口正常计算结束后,不会马上清理状态,会多保留Allow lateness时间。适用于:DataStream SQL

(2)SideOutput:对迟到数据打一个tag,然后在DataStream上根据这个tag获取迟到数据流,然后业务层面自行选择处理。适用于DataStream  

增量计算vs全量计算

直接计算vs最后所有数据一起计算

EMIT是在window没有结束时,提前把window计算的部分结果输出。

通过DataStream里自定义Trigger实现,也可以通过SQL配置使用

2.高级优化

Mini-batch优化解决中间结果多,状态保存频繁

倾斜优化(local-global)解决数据倾斜问题

Distinct计算状态复用

Pane优化降低滑动窗口状态存储