【大数据】flink保证Exactly_Once的理解

本文详细介绍了Flink实现端到端exactly-once语义的条件,包括开启checkpoint、source的数据重发能力和sink的幂等性或事务性写入。重点讨论了事务性写入的两种方式:WAL和2PC,并以Flink-Sink-Kafka为例,展示了数据处理流程,包括pre-commit和commit阶段,以及如何在失败时确保数据一致性。
1、exactly once

要保证flink 端到端需要满足以下三点
1、flink要开启checkpoint
2、source支持数据重发
3、sink端幂等性写入、事务性写入。我们常使用事务性写入

sink 事务性写入分为两种方式
1、WAL(预写日志的方式):先将数据当作状态保存,当收到checkpoint完成通知后,一次性sink到下游系统
2、2pc(两阶段提交):大致的实现的过程就是:

  • 开始事务(beginTransaction)创建一个临时文件夹,来写把数据写入到这个文件夹里面。
  • 预提交(preCommit)将内存中缓存的数据写入文件并关闭。
  • 正式提交(commit)将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟。
  • 丢弃(abort)丢弃临时文件

若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。

2、使用flink-sink- kafka作为例子

一个典型例子:

  1. data source从kafka消费数据
  2. window聚合
  3. data sink将处理后的数据写入到kafka

data sink为了提供exactly-once保证,必须将一个事务中的数据都写入到kafka,一次commit包含了2个checkpoint之间的所有的写操作,这保证了当失败时,也会回滚所有的写操作。

第一步:pre-commit阶段。

pre-commit是一次checkpoint的开始,flink的checkpoint barrier在operator中传递,当一个operator接收到barrier,触发state snapshot。

比如Kafka source会保存消费的offset,完成后传递barrier。
这个过程如果仅仅只涉及internal state(internal state是由flink保存和管理的),是没有问题的,但是如果涉及到external state,则需要外部系统提供一致性保证,外部系统必须要提供对2PC的事务支持。

当所有的operator完成了checkpoint,Pre-commit阶段就算完成了。Checkpoint的snapshot包含了整个application的状态,包括外部系统的pre-commited的external state,如果发生失败,可以回滚到最近一次成功的snapshot。

第二步:JobManager通知所有的operator,checkpoint完成了,执行commit阶段。

例子中的data source和window operator没有external state,在commit执行阶段无需额外的操作。data sink有external state,需要commit这次事务。
整个流程如下:

  • 当所有的operator完成了pre-commit(checkpoint snapshot),开启一个commit。
  • 如果有一个pre-commit失败了,其他都abort,回滚到最近一次成功的checkpoint。
  • Pre-commit成功后,所有的operator和外部系统必须保证commit执行成功,如果有失败(如网络中断),则整个flink application fail,flink任务按重启策略重启,开始一次新的commit尝试。
Flink是一个强大的大数据处理框架,在流处理和批处理方面表现出色。 ### 使用方法 Flink基于同一个运行时(Flink Runtime),提供了流处理和批处理API,封装了DataStream API进行流处理,封装了DataSet API进行批处理,还提供了Table API / SQL统一批处理和流处理 [^1][^3]。 ### 应用场景 Flink适合对实时流数据处理和时间驱动应用,专门对流式数据设计。由于它是基于事件时间的引擎,支持流式处理和批处理,能根据事件时间对数据进行有序的处理,延迟是毫秒级,所以在实时性要求较高的场景中表现优异 [^2]。 ### 开发技巧 在Flink开发中,时间机制的选择很重要。Flink支持处理时间、事件时间和注入时间,可根据具体需求灵活选择。在容错机制方面,Flink使用两阶段提交协议来保证exactly once,开发者可以利用该机制确保数据处理的准确性 [^2]。 以下是一个简单的Flink流处理示例代码: ```java import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class FlinkStreamExample { public static void main(String[] args) throws Exception { // 创建执行环境 StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 从数据源获取数据 DataStream<String> text = env.socketTextStream("localhost", 9999); // 对数据进行处理 DataStream<Integer> counts = text .flatMap((String value, Collector<Integer> out) -> { for (String word : value.split(" ")) { out.collect(1); } }) .returns(Integer.class) .keyBy(value -> 0) .sum(0); // 将结果输出 counts.print(); // 执行任务 env.execute("Flink Streaming Example"); } } ```
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橙子园

期待你的鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值