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

106 阅读3分钟

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

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

我们之前学习了Exactly Once在Flink中的实现,明白了Flink中的Exactly Once语义和Checkpoint机制,今天我们来学习流计算中的window计算

概述

我们先来看一下流式计算和批式计算的区别

image.png

而在一般情况下,数据的实时性越高,数据价值越高。

批处理

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

处理时间窗口

实时计算:处理时间窗口

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

处理时间和事件时间

处理时间:数据在流式计算系统中真正处理时所在机器的当前时间

事件时间:数据产生的时间,比如客户端、传感器、后端代码等上报数据时的时间

事件时间窗口

实时计算:事件时间窗口

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

小结

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

Watermark

watermark表示为系统认为的当前真实的事件时间 具体的实现如下 SQL语句: image.png DataStream

image.png

小结

  • 1.含义:表示系统认为的当前真实事件
  • 2.生成:可以通过Watermark Generator来生成
  • 3.传递:取上游所有subtask的最小值
  • 4.部分数据断流:Idle Source
  • 5.迟到数据处理:Window 算子时丢弃;Join算子认为跟之前的数据无法join到

Window

滚动窗口

窗口划分: 1.每个key单独划分 2.每条数据只会属于一个窗口

窗口触发: Window结束时间到达的时候一次性触发

滑动窗口

窗口划分: 1.每个key单独划分 2.每条数据可能会属于多个窗口

窗口触发: Window结束时间到达的时候一次性触发

会话窗口

窗口划分: 1.每个key单独划分 2.每条数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge

窗口触发: Window结束时间到达的时候一次性触发

迟到数据处理

一条数据到来后,会用WindowAssigner给它划分一个window,一般窗口是一个时间区间,如果划分出来的window end比之前的watermark值还小,说明这个窗口已经触发了计算了,这条数据会被认为是迟到数据 如何处理:

image.png

小结

  • 1.三种(滚动、滑动、会话)窗口的定义
  • 2.迟到数据处理:AllowLateness、SideOutput
  • 3.增量计算和全量计算模型
  • 4.EMIT触发提前输出窗口的结果