我正在构建一个Flink流系统,该系统可以处理实时数据和历史数据。所有数据均来自同一来源,然后以split
的形式进入历史数据和实时数据。实时数据带有时间戳并带有水印,而历史数据则按顺序接收。在实时流窗口化之后,两个流将合并并流入同一处理管道。
我无法在任何地方找到EventTime流环境中的所有记录是否都需要打上时间戳,或者Flink甚至可以同时处理实时数据和历史数据的混合。这是可行的方法吗?还是会造成我经验不足的问题?对数据顺序有什么影响?
我们有此设置,可以进行部分回填。每个流都有一个ID进行键控,我们发送历史数据以替换一个ID的观测数据,而不会影响其他ID的实时处理。
答案 0 :(得分:2)
通常来说,最好的方法是在每个事件上都有适当的事件时间时间戳,并在所有地方使用事件时间。这样做的优点是能够对实时数据和历史数据使用完全相同的代码-当需要重新处理历史数据以修复错误或升级管道时,这非常有价值。考虑到这一点,通常可以通过简单地运行该应用程序的第二个副本进行回填,该副本用于处理历史数据而不是实时数据。
关于在同一应用程序中混合使用历史数据和实时数据,以及是否需要为历史事件提供时间戳和水印-这取决于细节。例如,如果要连接两个流,则历史流上的水印(或缺少水印)将阻止连接的流上的水印。如果您尝试在连接的流上使用事件时间计时器(或取决于计时器的窗口),这将很重要。
我不认为您会遇到问题,但是如果您遇到问题,则有以下两个想法: