Flink系列窗口随笔
Posted HUTEROX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink系列窗口随笔相关的知识,希望对你有一定的参考价值。
窗口概念
一句基于Flink流处理引擎的块处理的最佳方案。
窗口类型:时间窗口,计数窗口
基本流程:
1.先对数据分组
2.先开窗
3.窗口函数,对窗口实现怎么样的操作。
(
先分组的原因:
分组数据流将你的window计算通过多任务并发执行,以为每一个逻辑分组流在执行中与其他的逻辑分组流是独立地进行的
。
在非分组数据流中,你的原始数据流并不会拆分成多个逻辑流并且所有的window逻辑将在一个任务中执行,并发度为1。
不分组等价于Windowall操作
)
基本API:
这个很明朗了,其中 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:日常笔记上传)
以上是关于Flink系列窗口随笔的主要内容,如果未能解决你的问题,请参考以下文章
Flink 源码解读系列 DataStream 窗口分配器 WinowAssigner
Flink 源码解读系列 DataStream 窗口分配器 WinowAssigner
Flink实战系列Flink SQL 之 Session Window 的用法
Flink 源码解读系列 DataStream 窗口 Window 实现