大数据理论篇 No.3-看看Flink如何实现端到端的Exactly-once语义

第1章 流计算语义

1.1 最多一次 At-most-once

当流数据发生异常时,重启策略进行恢复时,不在对错误的数据进行重新计算,恢复过程中流过的数据也可能不被计算,所有数据最多只计算一次,At-most-once可能会丢失数据。

1.2 至少一次 At-least-once

当流计算发生异常时,重启策略进行恢复时,之前错误的数据可能会被重新计算,所有数据至少被计算一次,At-least-once语义可能会有数据重复。

At-least-once不等待Barrier对齐,在上次成功Checkpoint和下一次Checkpoint执行之前,已经流经算子的数据,在Checkpoint恢复之后,会被重复计算。

At-least-once有一个好处就是能够提高性能,原因就是At-least-once不需要Barrier对齐。

1.3 精准一次 Exactly-once

当流计算发生异常时,重启策略进行恢复时,数据不会丢失,也不会重复计算,做到精准一次计算

而Flink实现Exactly-once有两个东西必须要聊,那就是:CheckpointBarrier

Checkpoint是Flink的高可靠的基石,它保证Flink集群出现故障的时候,可以安全的恢复到之前的备份状态。

Barrier是标记,它被插入到数据流当中,随着数据一起在各算子之间流动,但它本身并不携带数据。Barrier会触发算子进行Checkpoint。Barrier将数据划分为多个数据区间,每个数据区间可以看作是一个Checkpoint所需要处理的数据集。

Flink利用数据流当中的Barrier作为对齐标志,当数据流到达算子的时候,Flink通过一个input buffer将提前到达的数据缓存起来,等待其他数据到达,Barrier对齐后,再处理数据,并进行Checkpoint。此时的Checkpoint因为已经通过Barrier对齐,所以即使在后续出现故障恢复,也是恢复到上一次Checkpoint对齐的状态,从而达到Exactly-once语义。

这里要特别注意Exatcly-once并不意味着每个事件都绝对精准处理一次,而是每个事件只影响计算结果一次

当然Exactly-once语义下,算子既然要等待所有input的barrier到达,就会出现延迟,性能会下降,如果这个时候出现反压,可能会造成Checkpoint失败。

到这里Flink的Checkpoint机制也只能保证Flink计算过程中可以达到Exactly-once,但是Source和Sink的Exactly-Once要如何实现呢?整个端到端的Exactly-once实际上是需要Source和Sink支持。接下来我们就来看看Flink如何在Source和Sink上支持Exactly-once。

 

第2章 Source节点的Exactly-once

Flink通过记录Source对数据源的消费位置,来实现Exactly-once语义,例如Kafka的Offset。

消费位置被存到远端存储,如果发生故障,恢复时将从远端获取到上一次消费的位置,继续本次的消费,从而达到Source节点的Exactly-once。

 

第3章 Sink节点的Exactly-once

简单的说就是两阶段提交:在我们常用的关系型数据库当中,经常用到的事务提交,其实就是两阶段提交。

当Flink向Sink节点输出数据的时候,当上一个Checkpoint执行完后,会生成当前Checkpoint的事务ID,这个事务ID和当前Checkpoint的数据一起被存到远端存储当中(比如HDFS);

存储事务ID的目的,是为了防止在将数据从临时存储刷到正式存储的过程当中,如果出现了异常,数据没有正在刷到正式存储当中,这个时候作业进行恢复,Flink可以根据远端存储State中的事务ID进行重试,以确保数据能正常的刷到正式存储当中。

而在上一个Checkpoint执行完成后和当前Checkpoint还未执行前,之间的数据,会被存到一个临时存储里面。

当前Checkpoint完成之后,才将临时存储当中的数据,持久化到正式的存储系统当中。

具体步骤我们根据TwoPhaseCommitSinkFunction中的4个方法来说:

  1. beginTransaction:开始事务,在目标文件系统存储上面的临时目录上创建一个临时文件。随后,程序处理的时候可以将数据写入到临时的存储文件。
  2. preCommit:预提交,将数据提交到临时存储当中。关闭文件,不要重新打开写入。我们也会为下一个checkpoint的文件写入开启一个新的事务。
  3. commit:提交,将预提交阶段的数据移动到正式的存储目录。很明显,两阶段提交将增加输出数据的可见性延迟。
  4. abort:在终止阶段,删除临时文件。

 

总结,Flink通过Source记录数据消费的偏移量、Operator对Barrier的对齐、Sink的两阶段提交;实现故障之后作业恢复,数据既不会丢失,也不会重复,实现了完整的端到端的精准一次(Exactly-once)。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pezynd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值