当前位置: 首页 > 知识库问答 >
问题:

Flink:处理数据早于应用程序水印的密钥流

邹英悟
2023-03-14

我使用Flink与运动源和事件时间键控窗口。应用程序将监听实时数据流,窗口化(事件时间窗口)并处理每个键控流。我有另一个用例,我也需要能够支持某些关键流的旧数据回填(这些将是具有事件时间的新关键流

鉴于我正在使用水印,这是一个问题,因为Flink不支持每键水印。因此,回填的任何键控流将最终被忽略,因为此流的事件时间将是

我经历了其他类似的问题,但没能得到一个可能的方法。以下是我正在考虑的可能方法,但仍有一些悬而未决的问题。

可能的办法-1

(i) 保留一份专用于回填目的的应用程序副本。回填作业很少发生(每月约几次)。发送到应用程序副本的数据流将在流中具有开始和停止指示器。我计划用它来启动/重置水印。悬而未决的问题?是否可以使用流中的指示器重置水印?我知道这不是最好的做法,但想不出替代方案。

后续行动:清除DataStream中的Flink水印状态[未提供最终解决方案。]

可能的方法-2每个键都有并行实例,因为每个任务可能有不同的水印。-

如果需要任何其他细节,请告诉我。

共有1个答案

吕霖
2023-03-14

您可以通过在批处理执行模式下运行回填作业来解决此问题。当DataStream API以批处理模式运行时,输入是有界的(有限的),并且是预先知道的。这允许Flink按键和时间戳对输入进行排序,并且处理将根据事件时间正确进行,而无需担心水印或延迟事件。

 类似资料:
  • 在Flink中,我发现了2种设置水印的方法, 第一个是 第二个是 我想知道哪个最终会生效。

  • 是否可以清除数据流中的当前水印? 一个月长的水印不允许延迟的示例输入: 通常,“2018年9月”的记录会因为时间太晚而被扔掉。当看到消息时,是否有方法以编程方式重置水印状态?

  • 我们已经构建了一个Flink应用程序来处理来自动觉流的数据。应用程序的执行流程包含基于注册类型过滤数据、基于事件时间戳分配水印的基本操作,以及应用于5分钟数据窗口的映射、处理和聚合功能,如下所示: 我的水印分配程序的参考代码: 现在,这个应用程序的性能很好(在几秒钟内的延迟方面),早就有了。然而,最近在上游系统post中发生了变化,其中Kinesis流中的数据以突发方式发布到流中(每天仅2-3小时

  • 我试图使用process函数对一组事件进行处理。我正在使用事件时间和键控流。我面临的问题是,水印值始终为9223372036854725808。我已经对print语句进行了调试,它显示如下: 时间戳------1583128014000提取时间戳1583128014000当前水印------9223372036854775808 时间戳------1583128048000提取时间戳1583128

  • 我通过在配置中设置属性从Azure函数中的密钥库中获取机密,方法是: 我不在上面的设置中使用秘密版本,这样每当键旋转发生时,它就会拉出最新的秘密版本。

  • 我读到了四个Kinesis流的数据。每个流中的数据都是不同的数据类型。读取所有四个流后,我分配时间戳和水印,并聚合来自每个流的数据。四个聚合的结果都是使用相同的泛型对象输出的。我想合并四个流的结果,这样我就可以将合并后的流发送到一个ProcessFunction。这基本上允许我像使用CoProcessFunction一样使用ProcessFunction,但我可以处理来自两个以上流的数据(在本例中