Processing time: Processing time refers to the system time of the machine that is executing the respective operation.
处理时间是当前流处理算子所在机器上的本地时钟时间。
基于处理时间的窗口会包含那些恰好在一段时间内到达窗口算子的事件,这里的时间段是按照机器上的本地时钟时间测量的。
基于处理时间的操作结果是不可预测的,计算结果是不确定的。当数据流的处理速度与预期速度不一致、事件到达算子的顺序混乱、本地时钟不正确,基于处理时间的窗口事件可能就会不一样。
事件时间Event time: Event time is the time that each individual event occurred on its producing device. This time is typically embedded within the records before they enter Flink, and that event timestamp can be extracted from each record.
事件时间是数据流中事件实际发生的时间。它附加在事件自身,在进入流处理引擎(Flink)前就存在。
即便事件有延迟,依赖事件时间也能反映出真实发生的情况,从而能准确地将事件分配到对应的时间窗口。
基于事件时间的操作是可预测的,其结果具有确定性。无论数据流的处理速度如何、事件到达算子的顺序怎样,基于事件时间的窗口都会生成同样的结果。
使用事件时间要克服的挑战之一是如何处理延迟事件。不能因为来了事件时间为一年前的事件,一年前的时间窗口就一直不关闭等待迟到事件的到来。这样就引出了一个重要的问题:怎么决定事件时间窗口的触发时机?换言之,需要等待多久才能确定已经收到了所有发生在某个特定时间点之前的事件?
The mechanism in Flink to measure progress in event time is watermarks. Watermarks flow as part of the data stream and carry a timestamp t. A Watermark(t) declares that event time has reached time t in that stream, meaning that there should be no more elements from the stream with a timestamp t’ <= t (i.e. events with timestamps older or equal to the watermark).
水位线(watermark)是一个全局进度指标,表示确信不会再有延迟事件到来的某个时间点。本质上,水位线提供了一个逻辑时钟,用来通知系统当前的事件时间。当一个算子接收到时间为t的水位线,就可以认为不会再收到任何时间戳小于或者等于t的事件了。
水位线允许我们在结果的准确性和延迟之间做出取舍。激进的水位线策略保证了低延迟,但随之而来的是低可信度。该情况下,延迟事件可能会在水位线之后到来,我们必须额外加一些代码来处理它们。反之,如果水位线过于保守,虽然可信度得以保证,但可能会无谓地增加了处理延迟。
实际应用中,系统可能难以获取足够多的信息来完美确定水位线。流处理引擎需提供某些机制来处理那些晚于水位线的迟到事件。根据具体需求的不同,可能直接忽略这些事件,可能将它们写入日志,或者利用它们修正之前的结果。
小结既然事件时间能解决大多数问题,为何还要去关心处理时间呢?事实上,处理时间也有其适用的场景。处理时间窗口能够将延迟降至最低。由于无需考虑迟到或乱序的事件,窗口只需简单地缓冲事件,然后在达到特定时间后立即触发窗口计算即可。因此,对于那些更重视处理速度而非准确度的应用,处理时间就会派上用场。另一种场景是,你需要周期性地实时报告结果而无论其准确性如何。例如,你想观察数据流的接入情况,通过计算每秒大致的事件数来检测数据中断,就可以使用处理时间来进行窗口计算。
总而言之,虽然处理时间提供了较低的延迟,但它的结果依赖处理速度,具有不确定性。事件时间则与之相反,能保证结果的相对准确性,并允许你处理延迟或无序的事件。
如何评测流处理的性能对于批处理应用而言,作业的总执行时间通常会作为性能评测的一个方面。但流式应用事件无限输入、程序持续运行,没有总执行时间的概念,所以常用延迟和吞吐来评测流式应用的性能。通常,我们希望系统低延迟、高吞吐。
延迟:表示处理一个事件所需的时间。即从接收事件至观察到事件处理效果的时间间隔。比如说,平均延迟为10毫秒,表示平均每条数据会在10毫秒内处理;95%延迟为10毫秒则表示95%的事件会在10毫秒内处理。保证低延迟对很多流式应用(告警系统、网络监测、诈骗识别、风险控制等)至关重要,从而滋生出所谓的实时应用。