apache flink_Apache Flink流处理中的事件时间

apache flink

在本周的白板演练中,Apache Flink的PMC成员和数据工匠的CTO Stephan Ewen描述了Apache Flink流处理的一项宝贵功能:将事件分组在一起,观察到这些事件是在可配置的时间范围内发生的,即事件时间。

对于其他相关资源:

这是抄录:

您好,我叫斯蒂芬。 我是Apache Flink的创建者之一,也是数据工匠的CTO。 今天,我将教您一些有关使用Apache Flink处理事件流的知识。

为了说明什么是事件时间以及为什么它是一件非常有用的事情,让我向您介绍一种典型的流处理方案。 我们有一组生产商。 可以将其视为典型的物联网,事件数据或事件生产者,手机,手机塔,智能汽车,它们都在不断产生事件,并且有时会将它们推入数据中心。 这是一个简化的视图; 通常涉及多个步骤,但是暂时将其视为简化版本。 事件被推送,它们最终在数据中心的消息队列中的某个点结束。 请务必注意,这些生产者经常连接和断开连接。 现在,在这些物联网数据生产者产生的一系列事件中,有时您可能需要运行一组流分析。 因此,过滤掉垃圾,关联事件,检测异常,离群值,仅计算随时间变化的统计信息-所有这些都是用例场景。

我们将为此使用Apache Flink,并且在这里看一个非常简单的分析方案。 我们基本上有两个运行在Apache Flink中的运算符,一个源运算符仅从消息队列中提取数据,还有一个称为窗口运算符。 窗口化意味着将确实属于某个概念的事件分组在一起。 最突出的概念是时间。 例如,将在同一小时之内彼此之间在15秒之内发生的事件分组在一起,而这与应用程序无关。

让我们以实际将这些事件按时间(例如按分钟)分组为例。 我们有所有这些生产者将消息推送到队列中,并且我们有Flink应用程序接收消息。 现在,如果我们按分钟分组,那么我们首先要考虑的是我们实际指的是哪种时间。 我们是否仅在此说一下流处理器的时间? 我们是指事件发生时的分钟,还是指事件发生时的分钟? 这两个概念称为处理时间和事件时间。

事件时间是指实际生成数据的时间点。 处理时间是指流处理接收到并对其进行分析的时间点。 现在,如果您考虑始终连接的设备,则实际上您会看到事件时间和处理时间通常相当接近。 在现代基础架构中,事件通过网络,消息队列,数据中心和分析应用程序花费的时间并不长。 但是,在更加物联网的情况下,您会看到它们之间的差异很大,主要是因为并非所有这些设备都始终保持连接。 手机可能恰好在覆盖不好的区域。 它可能没电了,只是关机,存储它尚未传输的事件,并在再次激活时传输它们。 智能汽车也会发生类似的事情,但是即使某些类型的传感器也会收集数据,但并不总是为了节省能源而一直传输数据,因为传输数据是如此耗能。 因此,这意味着当这些事件到达进行分析时,您实际上在现实世界中的时钟时间与发生这些事件时的时间截然不同。 因此,如果您实际上要关联事件,那么可以说是通过监视森林火灾的传感器关联事件。 将它们关联起来的时间可能比通过传感器观察到的时间关联起来更有趣,而不是由流处理器实际观察到的时间关联起来,这意味着通过事件时间而不是通过处理时间来分析它们。 因此,在按事件时间分析数据时,考虑到数据延迟或顺序混乱这一事实非常重要,这是Apache Flink在内部执行的操作,以帮助您做到这一点。

如果要按事件时间分析数据,您将要告诉系统的是它如何确定每个事件的事件时间。 大多数传感器或大多数生产设备都将时间戳直接附加到您可以在源中引用的事件,然后源会将该事件分类为该事件时间点的一部分。

消息源还将创建事件时间进度报告之类的东西,这是我们内部称为事件时间低水位标记的概念,这些进度报告指示事件时间中您实际看到数据的距离。 这是一种特定于用户和应用程序的机制,它考虑了您希望数据到达的延迟时间,要允许的延迟数据量以及何时定义截止点。

当流处理器实际上从此处的消息队列中拾取这些事件并对其进行分类,并为其添加事件时间戳时,它将根据该事件时间戳将它们放入窗口中。 因此,除了处理这些窗口必须严格依次工作的处理时间之外,在任何时间点,许多事件时间窗口都可以进行。 假设我们有一个从12点到12:30的窗口。 我们有一个从12:30到1:00的窗口,依此类推。 在任何时间点,它将拾取事件,对其进行分类,然后将其注入到该特定时间对应的窗口中。

窗口操作员还将等待水印。 您可以将其视为进度报告,表明事件时间已到该时间点,现在已观察到属于该时间段的所有事件。 在某个时间点,例如,水印告诉我们事件时间已达到12:30,这实际上可能是挂钟时间的12:45,或者实际上是12:30和两秒,具体取决于多晚以及您的数据如何混乱。 它将实际评估此窗口,计算最终汇总,最终帐户,一些标准差,然后将其发送到下游。 您可以将window运算符视为可以重新排序无序数据,缓冲数据并等待较晚数据的点,并且仅在系统认为还可以时才发出它,我实际上已经看到了所有感兴趣的东西。 这样,在现实世界中同时发生的事件,但是为了到达应用程序而花费了更长或更短的时间,实际上将重新组合在一起。

现在,这显然会导致流处理延迟,因为如果您必须等待较晚的数据,显然会不可避免地引入延迟。 因此,这些窗口实际上可以使用事件时间和处理时间的组合。 这意味着您可以告诉窗口按事件时间对数据进行分组,比方说在这半小时的窗口中,从12点至12:30,但如果有12:30之前的数据丢失,也不要永远等待,但只能等待最多五分钟,然后关闭并发出,然后将刚刚发生的一切都掉落。 这样,您可以捕获一定数量的延迟,比纯粹通过处理时间工作仍能获得更好的结果,但同时也会限制延迟。 您还可以做的是,可以按照实际告诉系统产生最终结果和事件时间的方式,将两者结合起来,这将尽可能完整,但是您还可以根据处理时间。 因此,您可以说到12:30时,您要发出一个包含该时间点之前观察到的所有结果的结果。 但是您保留数据,并使用不断出现的所有最新数据不断完善它,并且您看到的结果越多,就会发出更多的结果,直到发出包含所有内容的最终结果。 因此,通过这种机制,您可以在更有意义的数据之间权衡取舍,因为您可以根据事件时间,完整性和延迟正确地关联数据。

就是这样-感谢收看! 如果您有任何疑问,请随时将它们放在视频下方的小底部框中。

了解更多:


翻译自: https://www.javacodegeeks.com/2016/09/event-time-apache-flink-stream-processing.html

apache flink

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值