apache flink:如何使用本地预聚合计算windows?

qltillow  于 2021-06-25  发布在  Flink
关注(0)|答案(1)|浏览(610)

我有一个 DataStream 需要在上面计算一个窗口聚合。当我执行常规窗口聚合时,网络io非常高。因此,我想执行本地预聚合以减少网络io。
我想知道是否有可能在任务管理器上本地预聚合(即,在洗牌记录之前),然后执行完全聚合。flink的datastream api有可能做到这一点吗?
我的代码是:

DataStream<String> dataIn = .... 
dataIn
  .map().filter().assignTimestampsAndWatermarks()
  .keyBy().window().fold()
gcuhipw9

gcuhipw91#

flink的当前版本(flink 1.4.0,2017年12月)没有内置对预聚合的支持。但是,在下一个版本(1.5.0)中添加这个功能的工作正在进行中,请参见flink-7561。
您可以基于 ProcessFunction . 这个 ProcessFunction 可以将预聚体保持在 HashMap (固定大小)内存和寄存器中的定时器(事件时间和处理时间),定期发出预聚集。状态(即 HashMap )应保持在托管操作员状态,以防止发生故障时丢失数据。设置计时器时,需要遵守窗口边界。
请注意 FoldFunction 已弃用,应替换为 AggregateFunction .

相关问题