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

92 阅读6分钟

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

这是我参加青训营的第四天

一、概述(简述流式计算的基本概念,与批式计算相比的难点和挑战)

数据价值:实时性越高,数据价值越高

image.png 资源模型:跑完一个任务就结束为定时调度,长期就是一直存在。

1.2批处理

批处理模型典型的数仓架构为T+1架构,即数据计算时天级别的,当天只能看到前一天都计算结果。 通常使用的计算引擎为Hive或者5park等,计算的时候,数据是完全ready的,输入和输出都是确定性的。

1.2小时批计算

1.3处理时间窗口

实时计算:处理时间窗口 数据实时流动,实时计算,窗口结束直接发送结果,不需要周期调度任务。

1.4处理时间vs事件时间

image.png 处理时间:数据在流式计算中真正处理时所在机器的当前时间。 事件时间:数据产生的时间,比如客户端、传感器、后端代码等上报数据时的时间。

1.5 事件时间窗口

实时计算:事件时间窗口 数据实时进入到真实事件发生的窗口中进行计算,可以有效的处理数据延迟和乱序 image.png

1.6 Watermark

image.png

一小结

1.批式计算一般是T+1的数仓架构 2.数据实时性越高,数据的价值越高‘ 3.实时计算分为处理时间和事件时间 4.事件时间需要watemark配合来处理乱序

二、watermark(water mark的含义、生成方法、传递机制、以及一些典型场景的问题和优化)

2.1 什么是watermark

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

2.2 如何产生Watermark

SQLimage.png 减去五秒当做时间 DataStream image.png 减去20秒当做时间

2.3如何传递water mark

image.png

2.4如何通过Flink UI观察Watermark?

image.png image.png

2.5典型问题一

Per-partitionVSper-subtask watermark生成

per-subtask watermark生成
早期版本都是这种机制。典型的问题是如果一个source subtask消费多个partition,那么多个
partition之间的数据读取可能会加剧乱序程度。
per-partition watermark生成
新版本引入了基于每个partition单独的watermark生成机制,这种机制可以有效避免上面的问题。

2.6典型问题二

部分partition、subtask断流

根据watermark传递机制,下游subtask会将上游所有的subtask都最小值作为自身的watermark,如果上面有一个subtask的watermark不更新了,则下游的watermark都不更新
解决方案:idle source
当subtask断流超过配置的idle时间是,将当前subtask置于idle,并下发一个idle的状况给下游,下游在计算自身watermark的时候,可以忽略掉。

2.7典型问题三

迟到数据处理

watermark表示当前事件发生的真实时间,那晚于watermark都数据到来时,系统会认为这种数据是迟到数据。
算子自身来决定如何处理迟到数据:
window聚合,默认会丢弃迟到数据
双流join,如果是outer join,则可以认为它不能join到任何数据
cep 默认丢弃

小结

1.含义:表示系统认为的当前真实时间
2.生成可以通过watermark generator来生成
3.传递:取上游所有的subtask的最小值
4.部分数据断流:IDle source
5.迟到数据处理:window算子是丢弃,join算子任务跟之前的数据无法join到

三、window(window基本功能和高级优化)

3.1滚动窗口

image.png

窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发

3.2滑动窗口

image.png

窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发
滚动时间,可能一条数据会处于不同的窗口

3.3会话窗口

image.png

窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发
不能判断这条窗口的最后时间,只能确认当时时间,最后相同窗口合并导致之前窗口变的更大

3.1迟到数据处理

一般窗口是一个时间区间,如果划分出来的window比watermark值还小,说明这个窗口语句触发率计算l,这条数据会被认为迟到数据;
什么情况下会产生迟到数据?
只有事件事件才产生
怎么处理迟到数据
丢弃

3.1迟到数据处理

1.ALLow laterness
这种方式需要设置一个允许迟到的时间,设置之后,窗口正常计算结束后,不会马上清理状态,而是会多保留allowlateness这么长时间,在这段时间内如果还有数据到来。则继续之前的状态计算。
2.SideOutput(测输出流)
这种方式需要对迟到数据打tag,然后在datastream上根据这个tag获取迟到数据流,然后业务层面自行选择进行处理

3.1增量VS全量计算

image.png

3.1EMIT触发

什么叫EMIT

EMit输出指的是,在winodw没有结束的时候,提前把winodw计算的部分结果输出出来。
怎么实现

image.png

3.1小结

1.三种(滚动、滑动、会话)窗口的定义
2.迟到数据处理ALLOWlatenessSIdeoutput
3.增量计算和全量计算模型
4.EMIT触发提前输出窗口的结果
3.2MINI-batch优化

image.png image.png 上面单次访问,下面多次访问

3.2倾斜优化-local-global

image.png 因为红色多一些,直接进行local,会比较大,所有先计算,然后在local

3.2distinct计算状态复用

image.png

3.2Pane优化

image.png 先把数据计算两次,然后在进行更新 image.png 先划分为跟小的ke,可以组合成窗口,这样来说计算量和存储量相对来说可控

03.小结

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

四、案例分析(抖音DAU实时曲线计算和大数据任务资源使用实时统计分析) 需求一 使用Fink SQL计算抖音的日活曲线 image.png 问题是:所有数据都需要在一个sutask中完成窗口计算,无法并行, image.png 通过两阶段聚合来把数据打散,完成第一轮聚合,第二轮聚合只需要对各个分通的结果求和即可。 需求二:计算大数据任务的资源使用 image.png

image.png

image.png