Chapter 3. Watermarks
watermarks 主要是标记流处理系统中的时间(这里的流处理系统是以事件时间为驱动)
到目前为止,我们一直从pipeline设计者或数据科学家的角度来研究流处理。第二章介绍了水印,对事件时间处理中发生的位置和处理时间中结果何时输出的基本问题做了一部分回答。在本章中,我们将从流处理系统的底层机制的角度来探讨相同的问题。研究这些机制将有助于我们motivate, understand, and apply与水印相关的概念。我们将讨论如何在数据入口点创建水印,它们如何通过data processing pipeline传播,以及它们如何影响output timestamps。我们还将演示在处理无界数据时,水印如何保持必要的保证,以回答在事件时间数据的何处被处理以及何时materialized的问题。
Definition
考虑任何连续接受数据和输出结果的pipeline。我们希望解决一般的问题,即什么时候调用事件时间窗口关闭是安全的,窗口结束之后,不会再有这个窗口的数据到来。为了做到这一点,我们想描述一下pipeline相对于它的无界输入所取得的进展。
解决事件时间窗口问题的一种简单方法是简单地将事件时间窗口建立在当前处理时间的基础上。正如我们在第一章中看到的,我们很快就会遇到麻烦——数据处理和传输不是瞬时的,所以处理和事件时间几乎从不相等。管道中的任何停顿或尖峰都可能导致我们不正确地将消息分配给窗口。最终,这个策略失败了,因为我们没有强有力的方法来保证这些窗口。
另一种直观但最终不正确的方法是考虑管道处理的消息的速率。尽管这是一个有趣的度量标准,但速率可以随输入的变化、预期结果的可变性、可供处理的资源等任意变化。更重要的是,速率并不能帮助回答完整性的基本问题。具体来说,rate并不告诉我们什么时候看到了特定时间间隔内的所有消息。在真实的系统中,会有消息不能通过系统进行处理的情况。这可能是暂时性错误(如崩溃、网络故障、机器停机)的结果,也可能是持久性错误(如需要更改应用程序逻辑或其他手动干预才能解决的应用程序级错误)的结果。当然,如果出现大量故障,处理速度指标可能是检测故障的很好的代理。然而,速率指标永远不会告诉我们,单个消息无法通过我们的管道取得进展。然而,即使是一条这样的消息,也可能会任意地影响输出结果的正确性。
我们需要一种更鲁棒和合理的方式,来判断无界数据流的窗口结束时间。在此,我们做一个假设:假设无界数据流中的数据都有一个事件时间(即事件发生的事件)。基于这个假设,我们研究一下事件时间在计算管道(pipeline)中的假设。在分布式系统中,这个管道可能在多个计算节点(agent)上执行,多个agents同时消费源头数据,并不能保证数据的有序,其事件时间的分布如下:

上图表示了:流计算中,在eventtime上等待处理和处理完成的消息的分布。新消息进入流计算系统时,是待处理状态(in-fligt),被处理完成后,变成处理完成(completed)状态。这个分布图的关键点,是待处理消息最左边的那条边界线(即红色和蓝色部分中间的边界线),这条线代表了管道中待处理数据的最早时间戳。我们用这条线来定义watermark:
Watermark是单调递增的,管道中最早的待处理数据的事件时间戳。
Watermark两个基本属性:
- 完整性(completeness):单调递增,表示如果watermark经过了事件点T,那么T之前的数据已经到齐,T之前的窗口可以关闭了。
- 可视性(vilibility): 如果管道中消息由于某个原因被堵住了,则这个管道的watermark也就停止了。需要找到阻止watermark更新的消息才能处理问题。
Source Watermark Creation
这些水印从何而来?要为数据源建立水印,我们必须为从该数据源进入管道的每个消息分配一个逻辑事件时间戳。正如第2章告诉我们的,所有的水印创建都可以分为两大类:完美或启发式。为了提醒我们完美水印和启发式水印之间的区别,让我们看看图3-2,它展示了第二章中的窗口求和示例。


在这个窗口求和例子中,左边是完美型watermark,右边是启发式watermark。从这个例子里可以看出,完美型watermark能100%保证没有late event(晚到数据),而启发式watermark允许有late event(晚到数据)出现。watermark创建后,在pipeline下游会一直存在。至于创建完美型还是启发式watermark,完全跟数据源有关。接下来通过一些例子来说明。
创建完美式watermark
完美型watermark能严格保证窗口不需要处理晚到数据(late event),也就是当watermark通过某个eventtime时,不会再有这个event time之前的数据。真实世界的分布式系统数据源是无法保证的。一些可以使用perfect watermark的例子:
- 入口时间戳(Ingress Timestamping) : 将数据进入系统的时间(即处理时间)当作数据的事件事件。2016年前几乎所有的流计算系统

文章详细阐述了水印在流处理系统中的作用,包括如何创建、传播和影响输出时间戳。水印用于处理无界数据流的事件时间窗口,确保数据完整性。文中提到了完美水印和启发式水印的创建方法,以及水印在多阶段管道中的传播规则,强调了水印在处理延迟和结果正确性之间的平衡。此外,还讨论了处理时间水印在区分系统延迟和数据延迟中的作用,并举例说明了GoogleCloudDataflow和ApacheFlink的水印实现策略。
最低0.47元/天 解锁文章
1450

被折叠的 条评论
为什么被折叠?



