Flink EventTime 应用中的每条记录都需要时间戳吗?
Does every record in a Flink EventTime application need a timestamp?
我正在构建一个可以同时处理实时数据和历史数据的 Flink Streaming 系统。所有数据都来自同一来源,然后在 split
中分为历史数据和实时数据。实时数据带有时间戳和水印,而历史数据按顺序接收。在实时流被窗口化后,两个流被合并并流入同一个处理管道。
如果 EventTime 流环境中的所有记录都需要时间戳,或者 Flink 是否可以同时处理这种实时数据和历史数据的混合,我找不到任何地方。这是一种可行的方法还是会产生我经验不足看不到的问题?对数据顺序有什么影响?
我们有这个设置来允许我们进行部分回填。每个流都以一个 id 为键,我们发送历史数据来替换一个 id 的观察数据,同时不影响其他 id 的实时处理。
这是作业图:
一般来说,最好的方法是为每个事件设置适当的事件时间戳,并在所有地方使用事件时间。这样做的好处是能够对实时数据和历史数据使用完全相同的代码——当需要重新处理历史数据以修复错误或升级管道时,这是非常有价值的。考虑到这一点,通常可以通过简单地 运行 复制应用程序的第二个副本来进行回填——一个处理历史数据而不是实时数据的副本。
至于在同一个应用程序中混合使用历史数据和实时数据,以及是否需要为历史事件设置时间戳和水印——这取决于细节。例如,如果您要连接两个流,历史流上的水印(或缺少水印)将阻止连接流上的水印。如果您尝试在连接的流上使用事件时间计时器(或 windows,这取决于计时器),这将很重要。
我不认为你会 运行 遇到问题,但如果你这样做,有几个想法:
- 您可以继续在历史流上分配时间戳,并编写一个始终 returns Watermark.MAX_WATERMARK 的自定义周期性水印生成器。这将有效地禁用历史流的水印在连接到实时流时对水印产生的任何影响。
- 或者您可以解耦回填操作,并在另一个应用程序中执行此操作(通过在两个作业之间放置某种队列,例如 Kafka 或 Kinesis)。
我正在构建一个可以同时处理实时数据和历史数据的 Flink Streaming 系统。所有数据都来自同一来源,然后在 split
中分为历史数据和实时数据。实时数据带有时间戳和水印,而历史数据按顺序接收。在实时流被窗口化后,两个流被合并并流入同一个处理管道。
如果 EventTime 流环境中的所有记录都需要时间戳,或者 Flink 是否可以同时处理这种实时数据和历史数据的混合,我找不到任何地方。这是一种可行的方法还是会产生我经验不足看不到的问题?对数据顺序有什么影响?
我们有这个设置来允许我们进行部分回填。每个流都以一个 id 为键,我们发送历史数据来替换一个 id 的观察数据,同时不影响其他 id 的实时处理。
这是作业图:
一般来说,最好的方法是为每个事件设置适当的事件时间戳,并在所有地方使用事件时间。这样做的好处是能够对实时数据和历史数据使用完全相同的代码——当需要重新处理历史数据以修复错误或升级管道时,这是非常有价值的。考虑到这一点,通常可以通过简单地 运行 复制应用程序的第二个副本来进行回填——一个处理历史数据而不是实时数据的副本。
至于在同一个应用程序中混合使用历史数据和实时数据,以及是否需要为历史事件设置时间戳和水印——这取决于细节。例如,如果您要连接两个流,历史流上的水印(或缺少水印)将阻止连接流上的水印。如果您尝试在连接的流上使用事件时间计时器(或 windows,这取决于计时器),这将很重要。
我不认为你会 运行 遇到问题,但如果你这样做,有几个想法:
- 您可以继续在历史流上分配时间戳,并编写一个始终 returns Watermark.MAX_WATERMARK 的自定义周期性水印生成器。这将有效地禁用历史流的水印在连接到实时流时对水印产生的任何影响。
- 或者您可以解耦回填操作,并在另一个应用程序中执行此操作(通过在两个作业之间放置某种队列,例如 Kafka 或 Kinesis)。