彻底搞清Flink中的Window (6)

允许迟到
watermark>=window_n_end_time && watermark<window_n_end_time+lateness && window_n_start_time<=vent_time<window_n_end_time
在 watermark 大于窗口结束时间不超过特定延迟范围时,落在此窗口内的数据是有效的,可以触发窗口。

窗口聚合

增量聚合

窗口内来一条数据就计算一次

全量聚合

一次计算整个窗口里的所有元素(可以进行排序,一次一批可以针对外部链接)

使用

窗口之后调用 apply ,创建的元素里面方法的参数是一个迭代器

常用的一些方法

window

timeWindow和 countWind

process 和 apply

AssignerWithPeriodicWatermarks或接口AssignerWithPunctuatedWatermarks。
简而言之,前一个接口将会周期性发送Watermark,而第二个接口根据一些到达数据的属性,例如一旦在流中碰到一个特殊的element便发送Watermark。

自定义窗口

Window Assigner:负责将元素分配到不同的window。

Trigger即触发器,定义何时或什么情况下Fire一个window。

对于CountWindow,我们可以直接使用已经定义好的Trigger:CountTrigger trigger(CountTrigger.of(2))

Evictor(可选) 驱逐者,即保留上一window留下的某些元素。

最简单的情况,如果业务不是特别复杂,仅仅是基于Time和Count,我们其实可以用系统定义好的WindowAssigner以及Trigger和Evictor来实现不同的组合:

window 出现数据倾斜

window 产生数据倾斜指的是数据在不同的窗口内堆积的数据量相差过多。本质上产生这种情况的原因是数据源头发送的数据量速度不同导致的。出现这种情况一般通过两种方式来解决:

在数据进入窗口前做预聚合;

重新设计窗口聚合的 key;

关注公众号:Java大数据与数据仓库,回复 "资料",领取大数据资料,学习大数据技术。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwzpd.html