• 流式计算中的 Window 计算


    一、重点内容:

    • 概述流批计算、实时离线数仓的区别;window计算定义
    • 介绍实时计算中的Watermark概念
    • window类型及其实现原理、高级优化
    • 描述两个业务场景的需求

    二、详细知识点介绍:

    Watermark

    Flink 中的 Time 分为三种:事件时间、达到时间与处理时间。

    • 事件时间:是事件真实发生的时间。
    • 达到时间:是系统接收到事件的时间,即服务端接收到事件的时间。
    • 处理时间:是系统开始处理到达事件的时间。

    Flink文档

    This is precisely what watermarks do — they define when to stop waiting for earlier events.

    If you want to use event time, you will also need to supply a Timestamp Extractor and Watermark Generator that Flink will use to track the progress of event time.

    • Watermark定义:当前系统认为的事件时间所在的真实时间。(它们定义了何时停止等待较早的事件。

    • Watermark产生:从数据的事件时间来产生。最常见的包括使用当前事件时间的时间减去一个固定的delay,来表示可以可以容忍多长时间的乱序。

    • Watermark传递:上游将watermark传递给下游;下游收到多个watermark后默认取其中最小值来作为自身的watermark,同时它也会将自己watermark传递给它的下游。经过整个传递过程,最终系统中每一个计算单元就都会实时的知道自身当前的watermark是多少。

    Window

    Flink文档

    Computing windowed analytics with Flink depends on two principal abstractions: Window Assigners that assign events to windows (creating new window objects as necessary), and Window Functions that are applied to the events assigned to a window.

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SJXsBZ97-1659578838405)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/16687c486ca04ef0a75aa0dd8bf99445~tplv-k3u1fbpfcp-watermark.image?)]

    TUMBLE Window (滚动窗口)

    • 每分钟页面浏览量
    • TumblingEventTimeWindows.of(Time.minutes(1))

    HOP Window (滑动窗口)

    • 每分钟的页面浏览量每 10 秒计算一次
    • SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))

    SESSION Window (会话窗口)

    • 每个会话的页面浏览量,其中会话由会话之间至少 30 分钟的间隔定义
    • EventTimeSessionWindows.withGap(Time.minutes(30))

    迟到数据处理

    默认情况下,当使用事件时间窗口时,延迟事件会被丢弃。(注意,不是数据的时间晚于watermark就算是迟到,而是它所属的窗口已经被触发了才算迟到)。

    1、可以使用称为Side Outputs的机制安排将被丢弃的事件收集到备用输出流

    OutputTag lateTag = new OutputTag("late"){};
    
    SingleOutputStreamOperator result = stream.
        .keyBy(...)
        .window(...)
        .sideOutputLateData(lateTag)
        .process(...);
      
    DataStream lateStream = result.getSideOutput(lateTag);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2、drop掉。默认情况下允许的延迟为 0。,watermark后面的元素被丢弃(或发送到侧输出)。

    stream.
        .keyBy(...)
        .window(...)
        .allowedLateness(Time.seconds(10))
        .process(...);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    注意:side output只有在DataStream的窗口中才可以用,在SQL中目前还没有这种语义,所以暂时只有drop这一个策略。

    三、引用参考&推荐书目

  • 相关阅读:
    6、如何将 Flink 中的数据写入到外部系统(文件、MySQL、Kafka)
    亲测flutter打包apk后大小,比较满意
    Linux常用命令
    Sonarqube-8.9版本测试单元测试覆盖率
    多智能体协作如何处理
    [每日一题] 2731. 移动机器人 (思维 + 前面元素所有差值求和)
    PICO《轻世界》体验:随心畅玩,洒脱创作,潜力无限
    622 设计循环队列——Leetcode天天刷【循环队列,数组模拟,双指针】(2022.8.2)
    vue3+ts项目打包后的本地访问
    议题征集中|KCD 2023 杭州站
  • 原文地址:https://blog.csdn.net/weixin_47866171/article/details/126154110