关于Flink滑动-滚动时间窗和触发器你知道多少——第八课

DBC 2.1K 0

一、Flink 核心-Window窗口介绍和应用场景

  • 文档地址
  • 背景
    • 数据流是一直源源不断产生,业务需要聚合统计使用,比如每10秒统计过去5分钟的点击量、成交额等
    • Windows 就可以将无限的数据流拆分为有限大小的“桶 buckets”,然后程序可以对其窗口内的数据进行计算
    • 窗口认为是Bucket桶,一个窗口段就是一个桶,比如8到9点是一个桶,9到10点是一个桶
  • 分类
    • time Window 时间窗口,即按照一定的时间规则作为窗口统计
      • time-tumbling-window 时间滚动窗口 (用的多)
      • time-sliding-window 时间滑动窗口 (用的多)
      • session WIndow 会话窗口,即一个会话内的数据进行统计,相对少用
    • count Window 数量窗口,即按照一定的数据量作为窗口统计,相对少用
  • 窗口属性
    • 滑动窗口 Sliding Windows
      • 窗口具有固定大小
      • 窗口数据有重叠
      • 例子:每10s统计一次最近1min内的订单数量

    关于Flink滑动-滚动时间窗和触发器你知道多少——第八课插图

    • 滚动窗口 Tumbling Windows
      • 窗口具有固定大小
      • 窗口数据不重叠
      • 例子:每10s统计一次最近10s内的订单数量

      关于Flink滑动-滚动时间窗和触发器你知道多少——第八课插图2

    • 窗口大小size 和 滑动间隔 slide
      • tumbling-window:滚动窗口: size=slide,如:每隔10s统计最近10s的数据
      • sliding-window:滑动窗口: size>slide,如:每隔5s统计最近10s的数据
      • size<slide的时候,如每隔15s统计最近10s的数据,那么中间5s的数据会丢失,所以开发中不用

二、Flink 核心-Window 窗口API和使用流程介绍

  • 什么情况下才可以使用WindowAPI
    • 有keyBy 用 window() api
    • 没keyBy 用 windowAll() api ,并行度低
    • 方括号 ([…]) 中的命令是可选的,允许用多种不同的方式自定义窗口逻辑

关于Flink滑动-滚动时间窗和触发器你知道多少——第八课插图4

  • 注意
    • 一个窗口内 的是左闭右开
    • countWindow没过期,但timeWindow在1.12过期,统一使用window;
  • 窗口分配器 Window Assigners
    • 定义了如何将元素分配给窗口,负责将每条数据分发到正确的 window窗口上
    • window() 的参数是一个 WindowAssigner,flink本身提供了Tumbling、Sliding 等Assigner
  • 窗口触发器 trigger
    • 用来控制一个窗口是否需要被触发
    • 每个 窗口分配器WindowAssigner 都有一个默认触发器,也支持自定义触发器
  • 窗口 window function ,对窗口内的数据做啥?
    • 定义了要对窗口中收集的数据做的计算操作
    • 增量聚合函数
      • 窗口保存临时数据,每进入一个新数据,会与中间数据累加,生成新的中间数据,再保存到窗口中
      • 常见的增量聚合函数有 reduceFunction、aggregateFunction
      • min、max、sum 都是简单的聚合操作,不需要自定义规则

       

    • 全窗口函数
      • 窗口先缓存该窗口所有元素,等窗口的全部数据收集起来后再触发条件计算
      • 常见的全窗口聚合函数 windowFunction(未来可能弃用)、processWindowFunction(可以获取到窗口上下文 更多信息)
    • 如果想处理每个元素更底层的API的时候用

       

三、Tumbling-Window滚动时间窗介绍和案例实战

  • 滚动窗口 Tumbling Windows
    • 窗口具有固定大小
    • 窗口数据不重叠

    关于Flink滑动-滚动时间窗和触发器你知道多少——第八课插图

     

  • 比如指定了一个5分钟大小的滚动窗口,无限流的数据会根据时间划分为[0:00, 0:05)、[0:05, 0:10)、[0:10, 0:15)等窗口
  • 案例实战(可以单一个数据测试,后续再讲时间语义)

代码实战

Flink14TumblingWindowApp

点击查看完整内容

控制台输出

点击查看完整内容

四、Sliding -Window滑动时间窗介绍和案例实战

  • 滑动窗口 Sliding Windows
    • 窗口具有固定大小
    • 窗口数据有重叠
    • 例子:每10s统计一次最近1min内的订单数量

https://ci.apache.org/projects/flink/flink-docs-release-1.13/zh/docs/dev/datastream/operators/windows

  • 案例实战
    • 每5秒统计过去20秒的不同视频的订单总价

关键代码

DataStream<VideoOrder> sumDS = keyByDS.window(SlidingProcessingTimeWindows.of(Time.seconds(20),Time.seconds(5))).sum("money");

完整代码

Flink15SlidingWindowApp

点击查看完整内容

控制台输出

点击查看完整内容

五、基于数量的Count Window窗口介绍和案例实战

  • 基于数量的滚动窗口, 滑动计数窗口
  • 案例:
    • 统计分组后同个key内的数据超过5次则进行统计 countWindow(5)
    • 只要有2个数据到达后就可以往后统计5个数据的值, countWindow(5, 2)

关键代码

        //数据源 source
        DataStream<VideoOrder> ds = env.addSource(new VideoOrderSourceV2());
​
        KeyedStream<VideoOrder, String> keyByDS = ds.keyBy(new KeySelector<VideoOrder, String>() {
            @Override
            public String getKey(VideoOrder value) throws Exception {
                return value.getTitle();
            }
        });
​
        //分组后的组内数据超过5个则触发
        //DataStream<VideoOrder> sumDS = keyByDS.countWindow(5).sum("money");
​
        //分组后的组内数据超过3个则触发统计过去的5个数据
        DataStream<VideoOrder> sumDS = keyByDS.countWindow(5,3).sum("money");
​
        sumDS.print();

Flink16CountWindowApp

点击查看完整内容

控制台输出

点击查看完整内容

发表评论 取消回复
表情 图片 链接 代码

分享