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

113 阅读2分钟

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

本节课主要讲述了流式计算的基本概念,watermark的含义,window的定义,以及相关优化问题,最后包含了两个案例分析。

1. 概述

特点批式计算流式计算
数据时效性天级别分钟级别
准确性精准精准和时效性取舍
计算模型Exactly-OnceAt least once/exactly once
资源模型定时调度长期持有
主要场景离线天级别数据报表实时数仓、实时营销、实时风控

(实时性越高,价值越大)

  • 典型数仓架构:T+1(当天只能看到前一天的计算结果)
  • 小时级批计算
  • 处理时间:真正处理时所在机器的时间
  • 事件时间:数据产生的时间 (理想是同时处理,实际上处理时间要比事件时间有所延迟)
  • 实时计算:事件时间窗口
  • 事件时间需要Watermark需要配合处理乱序

2. Watermark

  1. 定义:表示系统认为的当前真实的事件时间

  2. 如何产生?—— SQL/DataStream

  3. 传递:取上游subtask最小值

  4. Flink UI 观察 Watermark

  5. 典型问题

(1)Per-subtask watermark:一个source subtask消费多个partition,partition之间数据读取可能会加剧乱序

(2)Per-partition watermark

(3)部分partition/subtask断流:Idle source(设置配置时间)

(4)迟到数据处理:Window聚合,默认丢弃;双流join;CEP,默认丢弃

3. Window

  1. 典型窗口:滚动,滑动,会话窗口

(1)滚动窗口:每一个key单独划分;每条数据只会属于一个窗口

(2)滑动窗口:每个key单独划分;每条数据可能属于多个窗口

(3)会话窗口:每个key单独划分;每条数据单独划分窗口

(4)迟到数据:丢弃

Allow lateness:设置一个允许迟到的时间(适用于DataStream/SQL)

SideOutput(侧输出流):打一个tag(适用于DataStream)

(5)增量 vs 全量计算:直接进行计算 vs 保留所有数据一起计算

(6)EMIT:中间结果输出多次

  1. 高级优化

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

(2)倾斜优化 local-global

(3)Distinct计算状态复用:降低状态量

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

4. 案例分析

  1. Flink SQL 计算抖音的日活曲线

    通过两阶段聚合把数据打散

  2. 计算大数据任务的资源使用(离线计算)