首页 > 解决方案 > 优化 flink 窗口

问题描述

我有 flink 工作,我需要在 1 小时内对收到的记录进行重复数据删除。重复数据删除后,我需要收集所有这些已重复数据删除的文档并进行一些聚合(例如计数),然后生成目标主题。

附上我的 flink 工作的图片:附上我flink工作的图片

现在,因为我只需要收集那些重复数据的文件,我可能不一定需要等待 1 小时。我怎样才能避免这个 1 小时的窗口只是为了收集这些文件,但是一旦它们收集了就继续进行聚合。

因此,我想避免的资源占用内存和检查点大小正在增加。

水印策略:

WatermarkStrategy<PlImaGuidInterimMessageVO> watermarkStrategy =  WatermarkStrategy
            .<PlImaGuidInterimMessageVO>forBoundedOutOfOrderness(Duration.ofMillis(maxOutOfOrderness))
            .withTimestampAssigner((event, timestamp) -> event.getEventTimeStamp());

任何建议,将不胜感激。

标签: apache-flinkflink-streaming

解决方案


除非您正在执行未显示的异常操作,否则第二层窗口将在收到第一层的结果后立即关闭。换句话说,一旦完成重复数据删除,您就应该得到最终结果。

但是,翻转窗口并不是实现重复数据删除的理想技术。问题是窗口与时代对齐。这意味着时间戳为 1:59 且在 2:01 重复的事件不会被删除重复数据。

在我看来,最好使用带有计时器的简单 KeyedProcessFunction。对流进行键控,以便只有重复项具有相同的键,并在 ValueState 中使用布尔值来记住给定键最近是否已被看到足够多,以至于应过滤掉后续出现。使用 Timer 清除状态。

会话窗口是实现重复数据删除的另一种好方法,尽管语义再次不同。


推荐阅读