我有一个 DataStream
需要在上面计算一个窗口聚合。当我执行常规窗口聚合时,网络io非常高。因此,我想执行本地预聚合以减少网络io。
我想知道是否有可能在任务管理器上本地预聚合(即,在洗牌记录之前),然后执行完全聚合。flink的datastream api有可能做到这一点吗?
我的代码是:
DataStream<String> dataIn = ....
dataIn
.map().filter().assignTimestampsAndWatermarks()
.keyBy().window().fold()
1条答案
按热度按时间gcuhipw91#
flink的当前版本(flink 1.4.0,2017年12月)没有内置对预聚合的支持。但是,在下一个版本(1.5.0)中添加这个功能的工作正在进行中,请参见flink-7561。
您可以基于
ProcessFunction
. 这个ProcessFunction
可以将预聚体保持在HashMap
(固定大小)内存和寄存器中的定时器(事件时间和处理时间),定期发出预聚集。状态(即HashMap
)应保持在托管操作员状态,以防止发生故障时丢失数据。设置计时器时,需要遵守窗口边界。请注意
FoldFunction
已弃用,应替换为AggregateFunction
.