exactly-once语义就是保证最后的数据处理的结果和数据摄入时没有数据的丢失与重复。
checkpoint包含了,flink应用现在的状态与数据输入流的位置(对于kafka来说就是offset);
checkpoint可异步的持久化到像s3或者hdfs这样子的存储系统里面。如果flink应用失败或者升级时,可以拉取checkpoint中的状态来恢复上次失败时的数据。
在flink1.4.0之前,flink通过checkpoint保证了flink应用内部的exactly-once语义。现在加入了TwoPhaseCommitSinkFunctio可以保证端到端的exactly-once语义。
两次提交来保证语义的方式需要flink所连接的外部系统支持两部提交,也就是外部系统要支持可以预提交和回滚没有最终提交的数据这样子的特性。
Flink通过状态和两次提交协议来保证了端到端的exactly-once语义。
两步提交的类有四个状态:
开始事物(beginTransaction)- 创建一个临时文件夹,来写把数据写入到这个文件夹里面。
预提交(preCommit)- 将内存中缓存的数据写入文件并关闭。
正式提交(commit)- 将之前写完的临时文件放入目标目录下。这代表着最终的数据会有一些延迟。
丢弃(abort)- 丢弃临时文件
若失败发生在预提交成功后,正式提交前。可以根据状态来提交预提交的数据,也可删除预提交的数据。