Flink系列窗口随笔

窗口概念

一句基于Flink流处理引擎的块处理的最佳方案。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4gBv8dW-1635318379582)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211027083327496.png)]

窗口类型:时间窗口,计数窗口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cU6VkunQ-1635318379584)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211027082904911.png)]

基本流程:

1.先对数据分组

2.先开窗

3.窗口函数,对窗口实现怎么样的操作。

先分组的原因:

分组数据流将你的window计算通过多任务并发执行,以为每一个逻辑分组流在执行中与其他的逻辑分组流是独立地进行的

在非分组数据流中,你的原始数据流并不会拆分成多个逻辑流并且所有的window逻辑将在一个任务中执行,并发度为1

不分组等价于Windowall操作

基本API:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXPJGMdP-1635318379585)(C:\Users\31395\AppData\Roaming\Typora\typora-user-images\image-20211027084005551.png)]

这个很明朗了,其中 slide就是步长的意思。

那么也给意味着这玩意就是滑动的。

Window API

首先说明Window这个API是最原生的,我们可以通过Window直接使用timewindow等窗口。

例如:

 studentdata.keyBy("age").timeWindow(Time.seconds(15));
        studentdata.keyBy("age").window(TumblingProcessingTimeWindows.of(Time.seconds(15)));

这个两个家伙是等价的。

具体的还入下:

在这里插入图片描述

在这里插入图片描述

timewindow的源码
在这里插入图片描述

那么为什么还要说这个玩意的,原因也很现实。那就是用window来实现会话窗口。

会话窗口实现:

       studentdata.keyBy("age").window(EventTimeSessionWindows.withGap(Time.seconds(15)));

窗口函数

对于窗口函数我们也有两大分类,一个是增量聚合,一个是全窗口函数。

前者其实即使在窗口当中来一个数据处理一个数据

ReduceFunction AggregateFunction

后者就是当数据把窗口填满了或者达到某个条件,或者时间到了的时候那么进行计算。

ProcessWindowFunction WindowFunction

Aggregate 示例

SingleOutputStreamOperator<Integer> aggregate = studentTupleTimeWindowWindowedStream.aggregate(new AggregateFunction<Student, Integer, Integer>() {
    
    //输入类型,中间类型,输出类型
    @Override
    public Integer createAccumulator() {
        //初始化其实是integer的初始值(中间那个),createAccumulator其实就是initialAccumulator不过你这个是自己定义的所以类似于create
        return 0;
    }

    @Override
    public Integer add(Student student, Integer integer) {
        return integer + 1;
    }

    @Override
    public Integer getResult(Integer integer) {
        return integer;
    }

    @Override
    public Integer merge(Integer integer, Integer acc1) {
        return null;
    }
});

其他的reduce以前演示过,其实都是聚合里面的(见Flink随笔上)

apply其实也很简单实现windowFunction即可。

一般情况下使用 aggregate是比较好的,灵活度比较高。

其他API说明

tigger

这玩意是窗口触发器。

evictor

这个是移除器。

sideOutputLateData(latertag)

这个是给迟到的数据打个标签,后面对应的是接受

aggregate.getSideOutput(latertag);

总结

关于窗口的话其实很简单没啥好说的,只要把前面的东西搞懂了就ok的。
(Ps:日常笔记上传)

猜你喜欢

转载自blog.csdn.net/FUTEROX/article/details/120993444