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

时间:2017-12-15 03:51:43

标签: apache-flink flink-streaming

我有DataStream,需要在其上计算窗口聚合。当我执行常规窗口聚合时,网络IO非常高。 所以,我想执行本地预聚合以减少网络IO。

我想知道是否可以在任务管理器上本地预先聚合(即,在洗牌之前),然后执行完整聚合。 Flink的DataStream API可以实现吗?

我的代码是:

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

1 个答案:

答案 0 :(得分:0)

Flink的当前版本(Flink 1。4。0,2017年12月)没有内置的预聚合支持。但是,在为下一个版本(1.5.0)添加此功能的方法上有一些努力,请参阅FLINK-7561

您可以基于ProcessFunction实施预聚合操作。 ProcessFunction可以将预聚合保留在内存中HashMap(固定大小)并注册定时器事件时间和处理时间)以定期发出预聚合。状态(即HashMap的内容)应保留在managed operator state中,以防止数据在发生故障时丢失。设置计时器时,您需要尊重窗口边界。

请注意,FoldFunction已被弃用,应由AggregateFunction替换。