Flink 窗口和水位线
Posted 棣棣的小屋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink 窗口和水位线相关的知识,希望对你有一定的参考价值。
什么是窗口
我认为的窗口是无限处理流的一个核心,因为stream是流数据,而batch是批数据,
window也是stream通往batch的一个转折,因为通过窗口可以实现批流一体
什么是水位线
个人理解:水位线是处理乱序数据或迟到数据的,如果和窗口一起使用的话,水位线还有一个功能就是可以控制窗口的关闭时间
窗口分类
时间窗口:滚动窗口:窗口长度固定,数据不重复
滑动窗口:窗口长度固定,数据重复
会话窗口:时间不固定,数据不重复
计数窗口:同上,不是以时间为单位,是到达一定个数触发窗口
窗口模型
assigner(分配器):如何将元素分配给窗口
function(计算函数):完成窗口的数据的计算
triger(触发器):什么条下完成触发计算
evictor(退出):完成计算后删除数据
水位线的使用:
SingleOutputStreamOperator<OrderGoodsWideEntity> orderwate = OrderDs.assignTimestampsAndWatermarks(
WatermarkStrategy.<OrderGoodsWideEntity>forBoundedOutOfOrderness(Duration.ofSeconds(1))
.withTimestampAssigner(new SerializableTimestampAssigner<OrderGoodsWideEntity>()
@Override
public long extractTimestamp(OrderGoodsWideEntity element, long recordTimestamp)
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String create_time = element.getCreateTime();
Date parse = null;
try
parse = format.parse(create_time);
catch (ParseException e)
e.printStackTrace();
return parse.getTime();
)
);
理解:因为设置水位线其实就是时间戳,水位线的时间语义是:事件时间(数据自带时间)
因为我数据源的时间类型是date类型,经过转换,转换为时间戳类型进行返回,如果时间语义为处理时间(processtime)就会看不出原有数据的效果,因为处理时间是系统时间
水位线和窗口的结合
就比如我上述代码中写的是延迟1s,我窗口设置了个滚动窗口30s意思就是延迟1s就是31s关闭窗口,执行并触发计算,水位线还有一个功能是处理乱序数据,就是可能31秒关闭窗口执行计算,32秒的数据在窗口关闭前到了,但是29s的数据未到,可以给个方法allower...在手动延迟多少时间,直到数据在窗口关闭前到达,如果还没有到达定义标签进行测输出;
keywindow和nokey window区别
如果在window前进行了key拆分聚合,将key相同的任务进行并行操作,如果是no key window的就是数据在一个窗口进行操作并行度就是1,大大降低了计算效率
keywindow
No key window
以上是关于Flink 窗口和水位线的主要内容,如果未能解决你的问题,请参考以下文章