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

116 阅读4分钟

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

1. 概述

1.1 流式计算vs批式计算

特性批式计算流式计算
数据存储HDFS、HiveKafka、Pulsar
数据时效性天级别分钟级别
准确性精准精准和时效性之间取得
典型计算引擎Hive、Spark、FlinkFlink
计算模型Exactly-onceAt Least Once/Exactly Once
资源模型定时调度长期持有
主要场景离线天级别数据报表实时数仓、实时营销、实时风控

1.2 批处理

  • T+1架构:数据计算是天级别的,当天只能看到前一天的计算结果
  • 小时级批计算
  • 如何做到更实时?

1.3 处理时间窗口

  • 实时计算:处理时间窗口
  • 数据实时流动,实时计算;数据进来,直接计算,窗口结束直接发送结果

2. Watermark

1. Watermark:当前系统认为的事件时间所在的真实时间,核心本质可以理解成一个延迟触发机制。在 Flink 的窗口处理过程中,如果确定全部数据到达,就可以对 Window 的所有数据做 窗口计算操作(如汇总、分组等),如果数据没有全部到达,则继续等待该窗口中的数据全 部到达才开始处理。这种情况下就需要用到水位线(WaterMarks)机制,它能够衡量数据处 理进度(表达数据到达的完整性),保证事件数据(全部)到达 Flink 系统,或者在乱序及延迟到达时,也能够像预期一样计算出正确并且连续的结果。

2. Watermark的生成方式:当任何 Event 进入到 Flink 系统时,会根据当前最大事件时间产生 Watermarks 时间戳,通常在接收到source的数据后,应该立即生成watermark,然后watermark随着数据流向传输。

3. Watermark的计算:Watermark =进入Flink 的最大的事件时间(mxtEventTime)-指定的延迟时间(t)

4. Whatermark触发窗口函数:如果有窗口的停止时间等于或者小于 maxEventTime - t(当时的warkmark),那么这个窗口被触发执行。

3. Window

3.1 窗口分类

TUMBLE Window (滚动窗口)

HOP Window (滑动窗口)

SESSION Window (会话窗口)

3.2 迟到数据处理

根据上面说到的watermark原理,watermark驱动某个窗口触发输出之后,这个窗口如果后面又来了数据,那这种情况就属于是迟到的数据了。(注意,不是数据的时间晚于watermark就算是迟到,而是它所属的窗口已经被触发了,才算迟到)。

对于迟到的数据,我们现在有两种处理方式:

  1. 使用side output方式,把迟到的数据转变成一个单独的流,再由用户自己来决定如何处理这部分数据
  2. 直接drop掉

注意:side output只有在DataStream的窗口中才可以用,在SQL中目前还没有这种语义,所以暂时只有drop这一个策略。

3.3 量计算 VS 全量计算

  • 增量计算:每条数据到来后,直接参与计算(但是还不需要输出结果)
  • 全量计算:每条数据到来后,先放到一个buffer中,这个buffer会存储到状态里,直到窗口触发输出的时候,才把所有数据拿出来统一进行计算

3.4 EMIT触发

正常的窗口都是窗口结束的时候才会进行输出,EMIT触发就是在这种情况下,可以提前把窗口内容输出出来的一种机制。比如我们可以配置一个1天的窗口,每隔5s输出一次它的最新结果,那这样下游就可以更快的获取到窗口计算的结果了。

这种emit的场景就是一个典型的retract的场景,发送的结果类似于+[1], -[1], +[2], -[2], +[4]。这样才能保证window的输出的最终结果是符合语义的。

4.案例分析

4.1 案例一:计算实时抖音DAU曲线

DAU(Daily Active User):指的是每天的去重活跃用户数

输出:每个5s更新一下当前的DAU数值,最终获得一天内的DAU变化曲线

滚动窗口+EMIT 使用倾斜优化。

两段聚合:第一轮将数据打散,根据uid分桶再求和,第二轮对各个分桶的结果求和

4.2 案例二:计算大数据任务的资源使用

通过会话窗口将数据划分到一个window中,然后将结果求和。

参考:【大数据专场 学习资料二】第四届字节跳动青训营 - 掘金 (juejin.cn)

总结

  1. Mini-batch优化解决频繁访问状态的问题;
  2. local-global优化解决倾斜问题;
  3. Pane优化降低滑动窗口的状态储存量;

参考

  1. 【大数据专场 学习资料二】第四届字节跳动青训营 - 掘金 (juejin.cn)
  2. Apache Flink: Stateful Computations over Data Streams