Flink三种时间语义及应用场景

Flink三种时间语义

(1)Event Time:事件发生的时间。
(2)Processing Time:事件处理的事件,没有事件时间的情况下,或者对实时性要求超高的情况下。
(3)Ingestion Time:事件进入Flink的时间,存在多个 Source Operator 的情况下,每个 Source Operator可以使用自己本地系统时钟指派 Ingestion Time。后续基于时间相关的各种操作,都会使用数据记录中的 Ingestion Time。

Event Time

事件发生的时间,这是实际应用最常见的时间语义,也是最常用的。往往是数据自身带的时间

特点:

  • 数据本身携带,时间取决于数据
  • 事件到达Flink之前就已经确定
  • 必须指定如何生成WaterMarks,用来表示Event Time进度的机制
  • 无论事件什么时候到达或者其怎么排序,最后处理 Event Time 将产生完全一致和确定的结果

Processing Time

事件处理时间 即事件被处理时机器的系统时间

特点:

  • 最简单的 Time 概念
  • 最好的性能和最低的延迟
  • 分布式和异步环境下,不能提供确定性(不能保证结果数据的准确性)
  • 容易受到事件到达系统的速度(如消息队列)、事件在系统内操作流动的速度和中断的影响

Ingestion Time

在数据源操作处(进入 Flink source 时),每个事件将进入 Flink 时当时的时间作为时间戳

特点:

  • 事件在进入数据源(Flink Source)时的时间作为时间戳()
  • 介于Event Time 和 Processing Time 之间
### Flink三种一致性语义 #### At-Least-Once (至少一次) At-Least-Once 语义确保每条记录至少被处理一次。这意味着,在发生故障并重启之后,某些记录可能会被重复处理。这种语义适用于那些对数据准确性有一定容忍度的应用场景。 为了实现这一目标,Flink 使用了检查点机制来定期保存应用程序的状态。当系统遇到失败时,可以从最近的一个检查点恢复,并重新处理自该检查点以来的所有输入流[^4]。 ```python env = StreamExecutionEnvironment.get_execution_environment() env.set_restart_strategy(RestartStrategies.fixed_delay_restart( attempts=3, delay_between_attempts_ms=1000)) ``` #### At-Most-Once (最多一次) At-Most-Once 是指每条消息要么被成功处理过零次或仅一次。然而,如果在处理过程中出现了错误,则可能导致部分未完成的消息丢失。因此,这类语义通常用于实时分析等场合下,其中少量的数据损失是可以接受的。 在这种模式下,Flink 不会启用任何额外的功能来进行状态管理或者容错处理;它只是简单地读取来自源头的数据并通过转换操作传递给下游组件。 ```python env = StreamExecutionEnvironment.get_execution_environment() env.disable_checkpointing() # 关闭checkpoint功能以达到at-most-once效果 ``` #### Exactly-Once (恰好一次) Exactly-Once 提供最强健的一致性保障——即保证每个事件都被准确无误地处理了一次且仅有这一次。这往往是最理想的状况,但在实际部署中可能面临更多挑战,因为要确保整个链路从数据源到接收端都能支持这样的特性。 对于 Flink 而言,通过其内置的支持两阶段提交协议(Two-phase commit protocol)以及与外部系统的集成能力,可以在很多情况下达成 End-to-End Exact Once Semantics[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值