Flink通过全局快照能保证内部处理的Exactly-once语义

但是端到端的Exactly-once还需要下游数据源配合,常见的通过幂等或者二阶段提交这两种方式保证

这里就来分析一下Sink二阶段提交的Flink源码是如何实现的

本文源码基于Flink1.14

老版本的话看TwoPhaseCommitSinkFunction,现在用SinkWriter逻辑都是差不多的

先来看下我们的主角  org.apache.flink.streaming.runtime.operators.sink.SinkOperator 类

1阶段. 在barrier到齐准备触发checkpoint之前

调用了数据源的预提交方法 prepareCommit

来看下已kafka为例具体做了什么

kafkaWriter就是调用了生产者的flush方法,在已经开始的事务里面刷数据

2阶段. 触发checkpoint保存状态数据的时候 snapshotState 方法

以kafka为例

会启动下一个checkpoint的kafka事务,直接就begin事务了,接着

用这次checkpoint需要commit的kafkaCommiter更新了状态, 会被保存下来,这里有事务信息的后面会用到

3阶段. 当checkpoint完成以后

已kafka为例,会直接提交事务了commit

这里可能会有疑问,,如果我只预提交了,还没有commit这时候跪了,那我从checkpoint恢复起来,那不就有问题了吗

带着疑问看下最后一个阶段

4阶段. 当任务失败从checkpoint恢复的时候

初始化的时候会恢复状态

可以看到会将上面说的上次checkpoint需要commiter的放到recoveredCommittables恢复队列里面

然后retrayWithDelay,就会根据我们保存的kafka事务信息id等去判断,上一次事务的状态,如果是预提交的话,就会先去commit了

总结一下流程:

prepareSnapshotPreBarrier快照触发前, 预提交事务,kafka里面就是flash
snapshotState快照保存时,开启一个新的事务kafka就是beginTransation,并且保存这次要提交的事务信息
notifyCheckpointComplete快照完成以后,调用对应的commit提交事务 , kafka就是commitTransation
initializeState从快照恢复,会先判断上次事务的状态如果还没提交会先提交



Flink 如何通过2PC实现Exactly-once语义 (源码分析)的更多相关文章

  1. 从flink-example分析flink组件(3)WordCount 流式实战及源码分析

    前面介绍了批量处理的WorkCount是如何执行的 <从flink-example分析flink组件(1)WordCount batch实战及源码分析> <从flink-exampl ...

  2. Flink中接收端反压以及Credit机制 (源码分析)

    先上一张图整体了解Flink中的反压   可以看到每个task都会有自己对应的IG(inputgate)对接上游发送过来的数据和RS(resultPatation)对接往下游发送数据, 整个反压机制通 ...

  3. Flink中TaskManager端执行用户逻辑过程(源码分析)

    TaskManager接收到来自JobManager的jobGraph转换得到的TDD对象,启动了任务,在StreamInputProcessor类的processInput()方法中 通过一个whi ...

  4. [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 目录 [源码分析] 带你梳理 Flink SQL / Table API内部执行流程 0x00 摘要 0x01 Apac ...

  5. Flink源码分析 - 源码构建

    原文地址:https://mp.weixin.qq.com/s?__biz=MzU2Njg5Nzk0NQ==&mid=2247483692&idx=1&sn=18cddc1ee ...

  6. flink checkpoint 源码分析 (二)

    转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...

  7. Flink的Job启动TaskManager端(源码分析)

    前面说到了  Flink的JobManager启动(源码分析)  启动了TaskManager 然后  Flink的Job启动JobManager端(源码分析)  说到JobManager会将转化得到 ...

  8. Flink中Idle停滞流机制(源码分析)

    前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...

  9. [源码分析] 从源码入手看 Flink Watermark 之传播过程

    [源码分析] 从源码入手看 Flink Watermark 之传播过程 0x00 摘要 本文将通过源码分析,带领大家熟悉Flink Watermark 之传播过程,顺便也可以对Flink整体逻辑有一个 ...

  10. [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast

    [源码分析] 从实例和源码入手看 Flink 之广播 Broadcast 0x00 摘要 本文将通过源码分析和实例讲解,带领大家熟悉Flink的广播变量机制. 0x01 业务需求 1. 场景需求 对黑 ...

随机推荐

  1. 【LeetCode】401. Binary Watch 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 java解法 Python解法 日期 [LeetCo ...

  2. 【剑指Offer】变态跳台阶 解题报告(Python)

    题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级 ...

  3. Primitive Roots(poj1284)

    Primitive Roots Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3928   Accepted: 2342 D ...

  4. 1246 - Colorful Board

    1246 - Colorful Board    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  5. 【kafka学习笔记】PHP接入kafka

    安装扩展 # 先安装rdkfka库文件 git clone https://github.com/edenhill/librdkafka.git 或者: wget https://gitee.com/ ...

  6. Codeforces1132A——Regular Bracket Sequence(水题)

    Regular Bracket Sequence time limit per test:1 second memory limit per test:256 megabytes input:stan ...

  7. API 网关功能

    反向代理和路由 - 大多数项目采用网关的解决方案的最主要的原因.给出了访问后端 API 的所有客户端的单一入口,并隐藏内部服务部署的细节. 负载均衡 - 网关可以将单个传入的请求路由到多个后端目的地. ...

  8. uniapp中scroll-view自定义滚动条

    注意事项 需在app.vue中添加如下,需要important /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 16upx!imp ...

  9. CS5268替代AG9321MCQ 替代AG9321方案 TYPEC转HDMI多功能拓展坞

    台湾安格AG9321MCQ是一款TYPEC拓展坞产品方案,他集中了TYPEC 转HDMI  VGA  PD3.0快充  QC3.0数据传输 I2S接口的音频DAC输出以及可以各种读卡器功能. Caps ...

  10. 使用 JavaScript 中的 document 对象查找 HTML 元素,实现“登录”按钮的高亮特效 鼠标悬浮于“登录”按钮时,按钮高亮显示;

    查看本章节 查看作业目录 需求说明: 使用 JavaScript 中的 document 对象查找 HTML 元素,实现"登录"按钮的高亮特效 鼠标悬浮于"登录" ...