青训营第四课流计算中的window计算 |青训营笔记

70 阅读2分钟

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

课堂内容

流计算和批计算的差异

image.png

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

image.png

Watermark

表示系统认为的当前真实的事件时间。代码如下

image.png 原理是通过watermark Generator在source之前,给数据一个筛选命令,同时这个命令也会传给下游 。我们可以在Flink UI中看到low watermark的值

image.png

  • per-subtask watermark生成的watermask可能会加剧乱序,per-partition watermask则不会。
  • 部分数据断流用Idle source算子处理
  • 迟到的数据的三种处理

image.png

Window的基础

  • 代码实现

image.png

  • 典型窗口:滚动窗口,滑动窗口,会话窗口

image.png

image.png

image.png 其他窗口:全局窗口,count窗口,累加窗口等等

  • 迟到数据的处理方法
    1,Allow lateness:设置一个允许迟到的时间,就是数据都算完了,但是不立刻释放,允许比如说迟到半个小时的数据继续进行计算
    2,SideOutput:对迟到的数据打一个tag,然后在DataStream上根据这个tag获取迟到数据,再去算这一部分的数据。
  • 增量计算和全量计算
    增量计算是只存储计算结果,不存储数据本身,典型的reduce,aggregate函数都是增量计算。全量计算是在window的stata中将数据全部存储,等window触发再拿出来算,这样的函数有process
  • EMIT输出 在window没有结束的时候,提前把window计算的部分结果输出出来。

image.png

window的高级优化

  • Mini-batch优化:解决频繁访问状态的问题

image.png

  • local-global优化:解决倾斜问题

image.png

  • Distinct计算状态复用:降低状态量

image.png

  • Pane优化:降低滑动窗口的状态存储量

image.png

案例分析

  • 抖音日活曲线:滚动窗口,还用了分桶两阶段聚合,来使得数据可以运行。

image.png

  • 大数据任务的资源使用:会话窗口

image.png

image.png