Spark Streaming只支持 Processing Time, Flink 支持三种时间语义, Processing Time, Event Time, Ingestion Time
- Processing Time 数据被处理时服务器的当前系统时间,这种时间语义比较常用,一般用于对时序性和准确性要求不太高的场景
- 最简单的Time概念,对于程序来说拥有最好的性能和最低的延迟。
- 分布式和异步环境下,不能保证结果数据的准确性,存在时序问题。
- 数据延迟对Flink的输出结果影响比较大。
- Event Time 事件发生的时间,是一条数据本身携带的时间字段。有时序要求,比如必须现有下单,再有支付等有先后关系的业务场景。
- 这种时间来自于数据本身,在事件到达Flink之前就已经确定。
- 必须指定如何生成WaterMarks,用来表示Event Time进度的机制。
- 无论事件什么时候到达或者其怎么排序,最后处理Event Time将产生完全一致和确定的结果,可以解决时序问题。
- Ingestion Time事件进入数据源(Flink Source)的时间。
介于Event Time和Processing Time之间,与Processing Time相比会自动生成并使用稳定的时间戳,虽然有一定成本,单结果更可预测,与Event Time相比无法处理无序事件或延迟数据,但是Ingestion Time不必指定如何生成水印,具有自动分配时间戳和自动生成水印功能。