Flink windows 幻灯片尺寸小但内容相同的优化?
Optimization of Flink windows with small slide size and same contents?
我们开发了一个 Flink 应用程序,它接收具有 id, value1, value2, ...
字段的消息在 Flink 应用程序中,它们由 id
键控,并分配了不同大小和 windows 的滑动 slide
的 10 秒。我们使用 AggregateFunction 为每个 id 计算一些统计数据,并将结果数据流下沉到 Redis。代码如下所示:
DataStream<Tuple2<String, String>> statistics = messages.keyBy(0)
.timeWindow(Time.seconds(300), Time.seconds(10))
.aggregate(new Min5Aggregate())
.setParallelism(20);
statistics.addSink(new CustomRedisSink()).setParallelism(20);
这样其他系统就可以通过读取Redis来使用和显示统计信息,每10秒更新一次结果。但是现在我们在这个实现中遇到了性能问题。我认为原因之一是为一些没有非常活跃的值更新的 ID 创建了多余的 windows。
假设 window 大小是 300 秒,并且有一个 id 每隔几个小时才会有新值。但是每次这个 id 的新值到达时,都会创建 30 (300s/10s) windows,并且 windows 具有相同的聚合输出,因为在它们过期之前没有更多的新值。我们现在做的是在对结果流进行换肤时,将输出结果与Redis中的值进行比较,如果相同则跳过更新。
为了优化性能,我想知道Flink有没有什么办法可以阻止window和前面的window内容相同时触发FIRE。这样就没有必要与 Redis 进行比较。或者,如果您对本系统有什么其他的优化建议,也会非常有帮助。
*由于还有其他id值更新频繁,我们需要有比较新的统计数据,所以增加幻灯片大小不是一个选择。
我不相信触发器可以保持前一个 window 的状态。 ProcessWindowFunction
可以保持早期 windows 的状态,所以这是一个选项。
一个相当直接的解决方案是在 window 和记忆先前结果的接收器之间插入一个 RichFlatMapFunction
,并且仅在新结果不同时才产生输出。
要对滑动 windows 进行更精细的优化,您可以将 window 实现为 KeyedProcessFunction
。通过这种方式,您可以将大约 30 个 10 秒切片以及完全聚合的结果保留 300 秒,然后每 10 秒您需要做的就是减去最旧的 10 秒并添加最新的 10 秒。对于繁忙的键,这应该比将每个事件添加到 30 windows 更有效——但是自己做所有的簿记肯定是更多的工作。 Flink 文档包括 an example of doing this for tumbling event time windows;滑动 windows 的扩展留给 reader.
我们开发了一个 Flink 应用程序,它接收具有 id, value1, value2, ...
字段的消息在 Flink 应用程序中,它们由 id
键控,并分配了不同大小和 windows 的滑动 slide
的 10 秒。我们使用 AggregateFunction 为每个 id 计算一些统计数据,并将结果数据流下沉到 Redis。代码如下所示:
DataStream<Tuple2<String, String>> statistics = messages.keyBy(0)
.timeWindow(Time.seconds(300), Time.seconds(10))
.aggregate(new Min5Aggregate())
.setParallelism(20);
statistics.addSink(new CustomRedisSink()).setParallelism(20);
这样其他系统就可以通过读取Redis来使用和显示统计信息,每10秒更新一次结果。但是现在我们在这个实现中遇到了性能问题。我认为原因之一是为一些没有非常活跃的值更新的 ID 创建了多余的 windows。
假设 window 大小是 300 秒,并且有一个 id 每隔几个小时才会有新值。但是每次这个 id 的新值到达时,都会创建 30 (300s/10s) windows,并且 windows 具有相同的聚合输出,因为在它们过期之前没有更多的新值。我们现在做的是在对结果流进行换肤时,将输出结果与Redis中的值进行比较,如果相同则跳过更新。
为了优化性能,我想知道Flink有没有什么办法可以阻止window和前面的window内容相同时触发FIRE。这样就没有必要与 Redis 进行比较。或者,如果您对本系统有什么其他的优化建议,也会非常有帮助。
*由于还有其他id值更新频繁,我们需要有比较新的统计数据,所以增加幻灯片大小不是一个选择。
我不相信触发器可以保持前一个 window 的状态。 ProcessWindowFunction
可以保持早期 windows 的状态,所以这是一个选项。
一个相当直接的解决方案是在 window 和记忆先前结果的接收器之间插入一个 RichFlatMapFunction
,并且仅在新结果不同时才产生输出。
要对滑动 windows 进行更精细的优化,您可以将 window 实现为 KeyedProcessFunction
。通过这种方式,您可以将大约 30 个 10 秒切片以及完全聚合的结果保留 300 秒,然后每 10 秒您需要做的就是减去最旧的 10 秒并添加最新的 10 秒。对于繁忙的键,这应该比将每个事件添加到 30 windows 更有效——但是自己做所有的簿记肯定是更多的工作。 Flink 文档包括 an example of doing this for tumbling event time windows;滑动 windows 的扩展留给 reader.