flink的事件时间、摄取时间、处理时间
在Flink中,事件时间、摄取时间和处理时间是用于处理流数据的三种时间概念。这三种时间概念分别反映了不同程序处理的时间特征。下面分别介绍它们的定义及区别:
-
事件时间(Event Time): 事件时间是指事件在数据源端实际发生的时间,通常信息保存在事件数据的元数据或者是数据内容中。事件时间允许Flink在出现乱序或者延迟的情况下仍然能够根据原始事件顺序正确处理数据,保证处理结果的正确性。事件时间需要用户显示指定提取方式。在基于事件时间的处理中,可能需要使用Watermark(水位线)技术,来协助处理乱序、延迟数据。
-
摄取时间(Ingestion Time): 摄取时间是指事件进入Flink处理程序的时间,可以看作是事件时间与处理时间的折衷。在摄取时间语义下,Flink会在读取数据源时,为每条数据自动添加上摄取时间戳。由于摄取时间是在数据进入Flink时生成的,所以无法处理乱序或延迟的数据。与处理时间相比,使用摄取时间依然可以利用时间进行窗口等操作,但是与事件时间相比,不能处理乱序数据。
-
处理时间(Processing Time): 处理时间是指事件在Flink处理程序实际处理的时间。处理时间的窗口在Flink的处理过程中,按照业务到达系统的时间来进行。由于处理时间完全依赖于系统处理速度,所以可能会有一定程度的不确定性,这可能导致结果的不稳定。处理时间对于实时性要求极高的场景比较适用。
总结一下,事件时间、摄取时间和处理时间的区别主要体现在以下几个方面:
-
时间语义不同:事件时间关注原始事件发生的时间,摄取时间关注数据进入Flink的时间,处理时间关注数据在Flink中实际处理的时间。
-
对乱序和延迟的处理能力不同:事件时间可以使用Watermark技术处理乱序和延迟,摄取时间和处理时间无法处理乱序和延迟。
-
使用场景不同:事件时间适用于要求结果准确性的场景,摄取时间适用于介于事件时间和处理时间的折衷场景,处理时间适用于实时性要求较高的场景。