Apache Flink:如何使用本地预聚合来计算窗口



我有一个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替换。

相关内容

  • 没有找到相关文章

最新更新