流计算中的window计算||青训营
这是我参加青训营的第四天
一、概述(简述流式计算的基本概念,与批式计算相比的难点和挑战)
数据价值:实时性越高,数据价值越高
资源模型:跑完一个任务就结束为定时调度,长期就是一直存在。
1.2批处理
批处理模型典型的数仓架构为T+1架构,即数据计算时天级别的,当天只能看到前一天都计算结果。
通常使用的计算引擎为Hive或者5park等,计算的时候,数据是完全ready的,输入和输出都是确定性的。
1.2小时批计算
1.3处理时间窗口
实时计算:处理时间窗口 数据实时流动,实时计算,窗口结束直接发送结果,不需要周期调度任务。
1.4处理时间vs事件时间
处理时间:数据在流式计算中真正处理时所在机器的当前时间。
事件时间:数据产生的时间,比如客户端、传感器、后端代码等上报数据时的时间。
1.5 事件时间窗口
实时计算:事件时间窗口
数据实时进入到真实事件发生的窗口中进行计算,可以有效的处理数据延迟和乱序
1.6 Watermark
一小结
1.批式计算一般是T+1的数仓架构 2.数据实时性越高,数据的价值越高‘ 3.实时计算分为处理时间和事件时间 4.事件时间需要watemark配合来处理乱序
二、watermark(water mark的含义、生成方法、传递机制、以及一些典型场景的问题和优化)
2.1 什么是watermark
表示系统认为的当前真实的事件时间
2.2 如何产生Watermark
SQL
减去五秒当做时间
DataStream
减去20秒当做时间
2.3如何传递water mark
2.4如何通过Flink UI观察Watermark?
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滚动窗口
窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发
3.2滑动窗口
窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发
滚动时间,可能一条数据会处于不同的窗口
3.3会话窗口
窗口划分:
每个key单独划分
每条数据只会属于一个窗口
窗口触发:
window结束时间到达的时候一次性触发
不能判断这条窗口的最后时间,只能确认当时时间,最后相同窗口合并导致之前窗口变的更大
3.1迟到数据处理
一般窗口是一个时间区间,如果划分出来的window比watermark值还小,说明这个窗口语句触发率计算l,这条数据会被认为迟到数据;
什么情况下会产生迟到数据?
只有事件事件才产生
怎么处理迟到数据
丢弃
3.1迟到数据处理
1.ALLow laterness
这种方式需要设置一个允许迟到的时间,设置之后,窗口正常计算结束后,不会马上清理状态,而是会多保留allowlateness这么长时间,在这段时间内如果还有数据到来。则继续之前的状态计算。
2.SideOutput(测输出流)
这种方式需要对迟到数据打tag,然后在datastream上根据这个tag获取迟到数据流,然后业务层面自行选择进行处理
3.1增量VS全量计算
3.1EMIT触发
什么叫EMIT
EMit输出指的是,在winodw没有结束的时候,提前把winodw计算的部分结果输出出来。
怎么实现
3.1小结
1.三种(滚动、滑动、会话)窗口的定义
2.迟到数据处理ALLOWlateness,SIdeoutput
3.增量计算和全量计算模型
4.EMIT触发提前输出窗口的结果
3.2MINI-batch优化
上面单次访问,下面多次访问
3.2倾斜优化-local-global
因为红色多一些,直接进行local,会比较大,所有先计算,然后在local
3.2distinct计算状态复用
3.2Pane优化
先把数据计算两次,然后在进行更新
先划分为跟小的ke,可以组合成窗口,这样来说计算量和存储量相对来说可控
03.小结
1.MINI-batch优化解决频繁访问状态的问题
2.local-global优化解决倾斜问题
3.DIstinct状态复用降低状态量
4.Pane优化降低滑动窗口的状态存储量
四、案例分析(抖音DAU实时曲线计算和大数据任务资源使用实时统计分析)
需求一
使用Fink SQL计算抖音的日活曲线
问题是:所有数据都需要在一个sutask中完成窗口计算,无法并行,
通过两阶段聚合来把数据打散,完成第一轮聚合,第二轮聚合只需要对各个分通的结果求和即可。
需求二:计算大数据任务的资源使用