【Flink】详解 Flink 的两阶段提交

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:
⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.
⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。
⭐️ 大数据平台建设指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台的核心技术和方法。
⭐️《遇见Python:初识、了解与热恋》 :涵盖了Python学习的基础知识、进阶技巧和实际应用案例,帮助读者从零开始逐步掌握Python的各个方面,并最终能够进行项目开发和解决实际问题。
⭐️《MySQL全面指南:从基础到精通》通过丰富的实例和实践经验分享,带领你从数据库的基本操作入手,逐步迈向复杂的应用场景,最终成为数据库领域的专家。
⭐️ 数据治理:通过通俗易懂的文章,学者们不仅能理解数据治理的重要性,还能掌握数据治理的基本原则和最佳实践。

Flink 的 两阶段提交(Two-Phase Commit,2PC) 协议是为了保证在流处理作业中,数据能够在外部系统(例如Kafka、HBase、数据库等)中实现 “Exactly Once” 语义的一种机制。它通过确保在发生故障时,既不会丢失数据,也不会发生数据重复处理。具体来说,Flink 的两阶段提交分为两个步骤:预提交阶段提交阶段

两阶段提交的核心思想

在Flink中,当数据流作业处理到某个checkpoint时,会触发两阶段提交的流程,确保在成功的checkpoint后,外部系统的状态也与Flink的内部状态保持一致。

第一步:预提交阶段(Prepare Phase)

在这个阶段,Flink并不会立即将计算结果写入外部系统,而是将这些结果暂存起来(通常是缓存在外部系统的事务中间状态)。具体步骤如下:

  1. 开启事务:Flink作业中的Sink操作首先会在外部系统中开启一个事务,用于接收处理中的数据。
  2. 处理数据:在事务开启后,Flink将处理后的数据写入事务,但并不会马上提交。这意味着,外部系统还无法看到这些写入的数据,这只是一个临时状态。
  3. 触发checkpoint:当Flink作业处理到checkpoint时,Flink会保存内部的状态,同时让外部的Sink操作进入“预提交”状态。这时,Flink将数据暂时存放在外部系统中,但尚未对外可见。

此时,Flink将状态持久化到分布式文件系统或其他状态后端,如果出现故障,可以从这个checkpoint恢复数据。

第二步:提交阶段(Commit Phase)

当checkpoint成功完成后,Flink会进入提交阶段,将数据真正写入外部系统,并对外公开。具体步骤如下:

  1. 确认checkpoint成功:当Flink的Job Manager确认checkpoint成功后,通知所有Sink的任务,准备提交数据。
  2. 提交事务:Sink接收到通知后,提交事务。这意味着,之前缓存在外部系统的中间结果正式生效,并对外部系统的用户可见。
  3. 完成操作:一旦数据提交,Sink的事务即结束,此时数据已经安全地写入外部系统。
异常处理
  • 预提交失败:如果在预提交阶段发生失败,Flink会直接终止该事务,数据不会写入外部系统,同时Flink会根据checkpoint机制从最近的checkpoint恢复数据。
  • 提交失败:如果在提交阶段发生失败,Flink会尝试重启作业并从checkpoint恢复。在恢复过程中,它会重新执行提交操作,确保数据最终一致性,不会因为失败而导致数据重复写入。

两阶段提交的优势

  • Exactly Once 语义:通过两阶段提交协议,Flink可以确保在故障发生时,数据既不会丢失,也不会重复写入外部系统。事务要么完全成功,要么完全失败,避免了部分提交的风险。
  • 事务隔离:在预提交阶段,数据暂时不可见,只有在Flink确认checkpoint成功后,外部系统的事务才会真正提交,从而确保数据的一致性。
  • 数据一致性:无论是Flink内部的状态,还是外部系统的状态,都能保持一致性,确保在处理实时流数据时的数据准确性。

典型应用场景

  1. Flink + Kafka:在处理Kafka数据时,Flink通过Kafka的事务API配合两阶段提交协议,确保消息的Exactly Once语义。在流式消费Kafka数据并处理后,将结果通过Kafka Sink写入另一个Kafka主题时,通过两阶段提交避免数据重复消费或丢失。
  2. Flink + 数据库(例如MySQL):在流式写入数据库的场景中,Flink通过JDBC Sink结合两阶段提交协议,确保每次写入数据库的操作都具有Exactly Once语义,防止数据重复插入或中途失败时状态不一致。

限制与挑战

  • 性能开销:两阶段提交虽然提供了高可靠性和Exactly Once语义,但其引入了额外的事务开销,尤其是在处理高吞吐量数据时,事务的开启和提交会影响系统的吞吐量。
  • 外部系统的支持:两阶段提交依赖于外部系统的事务支持,只有具备事务能力的外部系统才能配合Flink完成该机制。例如Kafka的事务API就能够很好的支持2PC,但某些系统可能不具备此能力。

总结

Flink的两阶段提交协议通过事务机制和checkpoint结合,确保数据在流处理作业中的一致性和Exactly Once语义。这种机制广泛应用于需要高可靠性、数据精确处理的场景,尽管存在一定的性能开销,但它在数据处理的准确性和安全性上提供了强有力的保障。


💗💗💗💗💗💗💗💗💗💗💗💗
在这里插入图片描述
💗💗💗💗💗💗💗💗💗💗💗💗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野老杂谈

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

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

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

打赏作者

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

抵扣说明:

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

余额充值