我有一个DataStream,需要在它上面计算一个窗口聚合。当我执行常规窗口聚合时,网络IO非常高。因此,我希望执行本地预聚合,以减少网络IO。
我想知道是否有可能在本地对任务管理器进行预聚合(即,在混洗记录之前),然后执行完整的聚合。使用Flink的DataStream应用程序接口可以做到这一点吗?
我的代码是:
DataStream<String> dataIn = ....
dataIn
.map().filter().assignTimestampsAndWatermarks()
.keyBy().window().fold()发布于 2017-12-15 16:01:53
当前版本的Flink (Flink 1.4.0,2017年12月)没有内置的对预聚合的支持。但是,在下一个版本(1.5.0)中添加此功能的工作正在进行中,请参阅FLINK-7561。
您可以基于ProcessFunction实现预聚合操作。ProcessFunction可以将预聚集保存在内存中的HashMap中(固定大小),并注册计时器、事件时间和处理时间),以周期性地发出预聚集。状态(即HashMap的内容)应该持久化在managed operator state中,以防止在发生故障时丢失数据。在设置定时器时,您需要遵守窗口边界。
请注意,FoldFunction已被弃用,应由AggregateFunction取代。
https://stackoverflow.com/questions/47825565
复制相似问题