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

88 阅读3分钟

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

首先回顾上一次学习的动态表的概念:

动态表:与表示批处理数据的静态表不同,动态表是随着时间变化的。可以像查询静态批处理表一样查询他们。数据库表是INSERT、UPDATE、DELETE DML语句的stream的结果,通常称为changelog stream。

在之前学习了Flink中实现Exactly-once语义,以及Flink中的Retract机制。

在这次学习中主要是了解实时计算和批式计算的本质区别,以及实时计算所带来的新的机遇和挑战;其次对实时计算中的核心功能:Watermark机制和Window机制进行了解。

流式计算和批式计算的对比:

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

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

批处理:

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

1659149069743.png

以此为基础要做到实时计算,也就是流处理。首先要处理时间窗口,数据在实时流动,进行实时计算,窗口结束则直接发送结果,不需要周期调度任务。

1659149647351.png

在实时计算中有两个概念需要进行区分:

  1. 处理时间:数据在流式计算系统中真正处理时所在及其的当前时间。

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

Watermark

Watermark指的是表示系统认为的当前真实事件的时间。

产生Watermark主要有两种方式:

  1. SQL:
CREATE TABLE Order (
    user BIGINT,
    peoduct STRING,
    order_time TIMESTAMP(3),
    WATWEMARK FOR order_time AS order_time - INTERVAL '5' SECOND
) WITH ( . . . );
  1. DateStream:
WatermarkStrategy
        .<Tuple2<Long, String>>forBoundedOutOfOrderness(Duration.ofSecond(20))
        .withTimestampAssigner((event, timestamp) -> event.f0);

Window

典型的Window:

  • Tumble Window (滚动窗口):其中每个key单独划分,每条数据只属于一个窗口。
  • Sliding Window (滑动窗口):其中每个key单独划分,每条数据可能属于多个窗口。
  • Session Window (会话窗口):其中每个数据会单独划分为一个窗口,如果window之间有交集,则会对窗口进行merge。

其他Window:

  • 全局 Window
  • Count Window
  • 累计窗口
  • ......

总结

  1. 对流式计算的基本概念进行了学习,并且和批式计算进行了对比;
  2. 对Watermark的概念、如何生存、如何传递以及如何处理等问题进行了学习;
  3. 对三种window的定义、如何处理进行了学习。