Flink EventTime应用程序中的每条记录都需要时间戳吗?

时间:2018-12-13 21:32:38

标签: apache-flink flink-streaming

我正在构建一个Flink流系统,该系统可以处理实时数据和历史数据。所有数据均来自同一来源,然后以split的形式进入历史数据和实时数据。实时数据带有时间戳并带有水印,而历史数据则按顺序接收。在实时流窗口化之后,两个流将合并并流入同一处理管道。

我无法在任何地方找到EventTime流环境中的所有记录是否都需要打上时间戳,或者Flink甚至可以同时处理实时数据和历史数据的混合。这是可行的方法吗?还是会造成我经验不足的问题?对数据顺序有什么影响?

我们有此设置,可以进行部分回填。每个流都有一个ID进行键控,我们发送历史数据以替换一个ID的观测数据,而不会影响其他ID的实时处理。

这是工作图: enter image description here

1 个答案:

答案 0 :(得分:2)

通常来说,最好的方法是在每个事件上都有适当的事件时间时间戳,并在所有地方使用事件时间。这样做的优点是能够对实时数据和历史数据使用完全相同的代码-当需要重新处理历史数据以修复错误或升级管道时,这非常有价值。考虑到这一点,通常可以通过简单地运行该应用程序的第二个副本进行回填,该副本用于处理历史数据而不是实时数据。

关于在同一应用程序中混合使用历史数据和实时数据,以及是否需要为历史事件提供时间戳和水印-这取决于细节。例如,如果要连接两个流,则历史流上的水印(或缺少水印)将阻止连接的流上的水印。如果您尝试在连接的流上使用事件时间计时器(或取决于计时器的窗口),这将很重要。

我不认为您会遇到问题,但是如果您遇到问题,则有以下两个想法:

  1. 您可以继续在历史流上分配时间戳,并编写一个自定义的定期水印生成器,该生成器始终返回Watermark.MAX_WATERMARK。这将有效地消除历史流在连接到实时流时对水印的影响。
  2. 或者您可以解耦回填操作,然后在另一个应用程序中执行此操作(通过在两个作业之间放置某种排队,例如Kafka或Kinesis)。