【问题标题】:Does every record in a Flink EventTime application need a timestamp?Flink EventTime 应用程序中的每条记录都需要时间戳吗?
【发布时间】:2018-12-13 21:32:38
【问题描述】:

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

如果 EventTime 流环境中的所有记录都需要时间戳,或者 Flink 甚至可以同时处理这种实时数据和历史数据的混合,我找不到任何地方。这是一种可行的方法还是会产生我没有经验的问题?对数据的顺序会有什么影响?

我们有这个设置允许我们进行部分回填。每个流都由一个 id 键控,我们发送历史数据来替换一个 id 的观察数据,同时不影响其他 id 的实时处理。

这是作业图:

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

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

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

    我不认为你会遇到问题,但如果你遇到了,有几个想法:

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

    【讨论】:

    • 感谢您的回答,大卫。不幸的是,我们需要使用数据子集即时进行部分回填的能力。我们不需要对连接的流执行任何基于事件时间的操作,但确实使用带有自定义触发器的全局窗口 - 这是一个问题吗?此外,历史项目上可以使用时间戳,我们只是没有分配时间戳,因为我们不想干扰全局水印 - 它不应该干扰吗?再次感谢您!
    • 我不完全理解您的要求,但无论如何我已经更新了我的答案。 :)
    • 抱歉,刚接触 Flink,还在学习如何描述需求和问题!感谢您的更新!
    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-18
    • 2021-02-25
    • 2011-07-30
    相关资源
    最近更新 更多