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

71 阅读3分钟

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

一、流式计算的基本概念

流式计算和批量计算是两种主要的大数据计算模式,分别适用于不同的大数据应用场景。 流数据是指在时间分布和数量上无限的一系列动态数据集合体,数据的价值随着时间的流逝而降低,因此必须实时计算给出秒级响应。流式计算,顾名思义,就是对数据流进行处理,是实时计算。批量计算则统一收集数据,存储到数据库中,然后对数据进行批量处理的数据计算方式。

image.png

二、Watermark

Watermark是Apache Flink为了处理EventTime窗口计算提出的一种机制,本质上也是一种时间戳,由Apache Flink Source或者自定义的Watermark生成器按照需求Punctuated或者Periodic两种方式生成的一种系统Event,与普通数据流Event一样流转到对应的下游算子,接收到Watermark Event的算子以此不断调整自己管理的EventTime clock。

Apache Flink框架保证Watermark单调递增,算子接收到一个Watermark时候,框架知道不会再有任何小于该Watermark的时间戳的数据元素到来了,所以Watermark可以看做是告诉Apache Flink框架数据流已经处理到什么位置(时间维度)的方式。

Watermark的产生方式

目前Apache Flink有两种生产Watermark的方式,如下:

Punctuated——数据流中每一个递增的EventTime都会产生一个Watermark。

在实际的生产中Punctuated方式在TPS很高的场景下会产生大量的Watermark在一定程度上对下游算子造成压力,所以只有在实时性要求非常高的场景才会选择Punctuated的方式进行Watermark的生成。

Periodic——周期性的(一定时间间隔或者达到一定的记录条数)产生一个Watermark。在实际的生产中Periodic的方式必须结合时间和积累条数两个维度继续周期性产生Watermark,否则在极端情况下会有很大的延时。

所以Watermark的生成方式需要根据业务场景的不同进行不同的选择。

三、Window优化

windowing概念

因为实时数据流是永不停歇的,我们无法获取所有的数据并产出一个最终的结果。更重要的是很多情况下我们更关心的是最近的状态,而不是从实时数据流启动至今的统计数据。所以我们将数据流切分为一个个片段,即计算窗口,比如最近5分钟或最近100条消息,然后在每个窗口的基础上进行统计,这种计算方式就是windowing。总而言之,windowing是将无边界的实时数据流划分为计算窗口的统计手段。通常window函数会配合groupby函数一起使用,即作用于grouped stream上。

windowing策略

Windowing策略从对象指标上分为3种,即基于时间(time window),基于计数(count window)以及基于会话(session window),其中基于时间和基于的windowing又可以分为滚动窗口(tumbling window)和滑动窗口(sliding window)。