我有DataStream
,需要在其上计算窗口聚合。当我执行常规窗口聚合时,网络IO非常高。
所以,我想执行本地预聚合以减少网络IO。
我想知道是否可以在任务管理器上本地预先聚合(即,在洗牌之前),然后执行完整聚合。 Flink的DataStream API可以实现吗?
我的代码是:
DataStream<String> dataIn = ....
dataIn
.map().filter().assignTimestampsAndWatermarks()
.keyBy().window().fold()
答案 0 :(得分:0)
Flink的当前版本(Flink 1。4。0,2017年12月)没有内置的预聚合支持。但是,在为下一个版本(1.5.0)添加此功能的方法上有一些努力,请参阅FLINK-7561。
您可以基于ProcessFunction
实施预聚合操作。 ProcessFunction
可以将预聚合保留在内存中HashMap
(固定大小)并注册定时器事件时间和处理时间)以定期发出预聚合。状态(即HashMap
的内容)应保留在managed operator state中,以防止数据在发生故障时丢失。设置计时器时,您需要尊重窗口边界。
请注意,FoldFunction
已被弃用,应由AggregateFunction
替换。