Apache flink 由简单事件生成的复杂事件的建模时间

Apache flink 由简单事件生成的复杂事件的建模时间,apache-flink,Apache Flink,我的flink应用程序基于(简单)输入事件的处理生成输出(复杂)事件。生成的输出事件将由其他外部服务使用。我的应用程序使用事件时间语义工作,所以我有点怀疑应该使用什么作为输出事件的时间戳 我应该使用: 生成它们时的处理时间 事件时间(由水印值给出) 两者都有?(*) 对于我的用例,我现在正在使用这两种方法。但也许你可以为每一个给定的选项提供例子/理由 (*)如果同时使用这两个字段,您会对这两个字段使用什么命名?事件时间和处理时间似乎将我的应用程序的实施细节泄露给了外部服务……您的问题没有一般

我的flink应用程序基于(简单)输入事件的处理生成输出(复杂)事件。生成的输出事件将由其他外部服务使用。我的应用程序使用事件时间语义工作,所以我有点怀疑应该使用什么作为输出事件的时间戳

我应该使用:

  • 生成它们时的处理时间
  • 事件时间(由水印值给出)
  • 两者都有?(*)
对于我的用例,我现在正在使用这两种方法。但也许你可以为每一个给定的选项提供例子/理由


(*)如果同时使用这两个字段,您会对这两个字段使用什么命名?事件时间和处理时间似乎将我的应用程序的实施细节泄露给了外部服务……

您的问题没有一般性的答案。这通常取决于下游需求。让我们看两个简单的例子:

  • 典型的数据处理管道接收某种移动事件(例如,传感器数据、点击网页、搜索请求),并通过连接使用主数据(例如,传感器校准数据、用户配置文件、地理信息)丰富它。那么结果事件显然应该与输入事件具有相同的时间
  • 第二条管道在15分钟的滚动窗口中聚合来自第一条管道的事件,并对其进行简单计数。然后,公平的选择是使用窗口的开始或第一个事件的时间、窗口的结束或最后一个事件的时间,或者同时使用这两种信息。使用窗口的开始/结束意味着我们有一个始终定义的结果信号。当您确实希望在聚合中看到事件发生时,使用第一个/最后一个事件时间戳更精确。通常,这也意味着您可能需要一些更精细的窗口分辨率(1分钟而不是15分钟)。无论您使用窗口的开头还是结尾,通常更多地取决于您的品味,您通常更安全地将两者都包括在内
在所有这些情况下,处理时间都不相关。事实上,如果您的输入是事件时间,我认为没有充分的理由需要处理时间。主要原因是您无法利用处理时间进行有意义的重新处理


您仍然可以添加处理时间,但原因不同:测量非常复杂的数据分析管道(包括多种技术和作业)的端到端延迟。

您在这里关心什么?你打算如何处理这些事件?您是否需要下游的活动时间??如何从简单事件创建复杂事件??简单事件有时间戳吗?你好,多米尼克。很抱歉让我的问题如此悬而未决…我主要担心的是,我有点犹豫是否将处理时间包含在我的案例中。输入事件有自己的时间戳,输出事件由输入事件加上某种用于检测特定模式/序列的规则生成。我想将两者都包括在内是一个安全的赌注,但我对自己提出疑问,首先包括处理时间是否有意义……感谢Arvid,我意识到这是非常特定于应用程序的。为了给您提供更多的上下文,在我的例子中,输入事件带有它们自己的时间戳,输出事件是由它们加上一些用于检测特定模式/序列的规则生成的。它可能是像
cpu.usage>.8这样简单的东西,但也可能是更复杂的东西,例如在给定时间范围内以特定顺序发生的特定事件的组合。这基本上取决于每一条规则。到目前为止,我在输出事件上附加了两个时间戳,由处理时间和事件时间水印组成……但您认为处理时间根本不起作用的评论让我怀疑,在生成输出事件时,我是否应该在Flink应用程序中使用事件时间水印值作为唯一的时间戳值。使用您提到的第一个和最后一个事件的时间戳在我的情况下是很困难的…所以我的选择是使用处理时间和/或水印值。我认为水印是纯技术性的,在应用逻辑时是随机的。根据水印的生成方式,如果多次执行,记录的外观会有所不同。这是我应该尽量避免的,因为这会让测试成为一场噩梦。您对水印的理解是什么?为什么它在这里有用?是的,您可以在测试中忽略时间戳。当然,您的时间戳未经测试;)。还取决于您的数据模型和更新频率,与测试每个字段的时间戳相比,维护完全相等的测试可能更容易。我有一些项目,我们做了选择性测试,而且很多时候新的特性(字段)没有导致修改/新的测试,因为旧的测试仍然通过。当然,这不可避免地会导致生产中的数据损坏。是的,从概念上讲,这也是最合理的选择。您创建了一个新的事件,就在您收到C的(事件)时间。这也使得以合理的方式聚合当时生成的几个事件成为可能。