我有一个DataStream
,需要在其上计算窗口聚合。当我执行常规窗口聚合时,网络IO非常高。因此,我想执行本地预聚合以减少网络io。
我想知道是否可以在任务管理人员(即在绘制记录之前)在本地预处理,然后执行完整的汇总。Flink的DataStream API是否可以?
我的代码是:
DataStream<String> dataIn = ....
dataIn
.map().filter().assignTimestampsAndWatermarks()
.keyBy().window().fold()
Flink的当前版本(Flink 1.4.0,2017年12月)不具有对预聚合的内置支持。但是,在下一个版本(1.5.0)中添加它的方法正在努力,请参见Flink-7561。
您可以基于ProcessFunction
实现预种类操作。ProcessFunction
可以在内存中将预聚合物保持在HashMap
(固定尺寸),并在记录计时器事件时间和处理时间中定期发射预聚合物。状态(即HashMap
的内容)应在托管操作员状态中持续存在,以防止发生故障时数据丢失。设置计时器时,您需要尊重窗口边界。
请注意,FoldFunction
已被弃用,应由AggregateFunction
替换。