本文源码基于flink1.14

在帮助用户排查任务的时候,经常会发现部分task处理的慢,在Exactly once语义时需要等待快照的对齐而白白柱塞的情况

在flink1.11版本引入了非对齐的checkpoint,来解决这种柱塞问题,所以来看看这个新特性的源码是如何实现的

先看下官网的图来总的说下实现原理,再来看看源码

flink是基于Chandy-Lamport算法来实现全局快照的,其核心就是在数据中间穿插barrier

当一个task上游同一批次所有的barrier到齐时,就可以触发快照状态的保存了,问题就是出在这里,等待对齐

来看下上面官网的图,是官网优化的一个具体思路

当某task的第一个barrier到时,那内部当前批次的状态必然是不完整的,那多久才算完整呢,等到这批checkpoint的数据全部都到齐都处理完,那状态就完整了

那当第一个barrier到的时候,剩下没到的数据在哪呢,答案就是,上游task的outBuffer(ResultSubpartition)和自己inBuffer(inputGates)里面

ok.分析到这里就可以看flink的思路了,如果当第一个barrier来的时候我不能触发checkpoint, 是因为还有部分数据没有处理到

那干脆就直接把这部分还没处理的数据(在buffer里面的数据),连同状态数据一起保存到checkpoint里面不就行了吗   ???

在从checkpoint恢复的时候就先把这部分buffer数据, 先恢复到当前task的buffer里面,继续计算就可以了,其实弱化了每个checkpoint批次的概念

这样一来当收到第一个barrier的时候,就可以直接触发checkpoint了

下面就是来看看Flink 源码的实现了

看下熟悉的StreamTask因为barrier在flink里面依然被当做数据的一种,在主循环里面看看接收到以后做了什么

先看输入inputBuffer的保存

在AbstractStreamTaskNetworkInput中接收数据的时候从inputGate拉取数据的时候

可以看到会根据数据的类型,如果是barrier类型会走到processBarrier方法

注意这里的这个barrierHandler是SingleCheckpointBarrierHandler实现类,因为非对齐模式的话收到第一个barrier就触发checkpoint了,所以也等同于sigle了

这里的state是实现类AlternatingWaitingForFirstBarrierUnaligned是非对齐模式特有的

来看看怎么处理的

可以看到在 SubtaskCheckpointCoordinatorImpl 中会准备inputFlight数据的快照,目的肯定就是为了保持到checkpoint中

这个方法prepareInflightDataSnapshot方法看下

会调用 BiFunctionWithException prepareInputSnapshot这个action对象,这个对象从哪里传进来的呢?

原来在StreamTask构造函数的时候就通过自己的prepareInputSnapshot方法来创建这个Function了

来看下这个方法的逻辑

会遍历所有的inputProcess然后调用它的准备快照方法

这个方法里面具体

就将具体的input的数据保存到state里面去了

input的保存就说完了

接着来看output缓存数据的保存

会到最开始的AlternatingWaitingForFirstBarrierUnaligned类当保存完input buffer的数据以后initInputsCheckpoint方法之后

来看下后面的逻辑

当触发完input数据的保存以后,就是触发全局的checkpoint了,这里会一直走到streamTask的triggerCheckpointOnBarrier在里面会走到performCheckpoint

最后在SubtaskCheckpointCoordinatorImpl类中

最后在 BufferWritingResultPartition 类里面

PipelinedSubpartition调用addbuffer然后将channelStateWriter.addOutputData把output buffer的数据保存到状态里面去了

讲完触发checkpoint保存缓存中的数据,接下来就是从chekpoint恢复的时候怎么恢复这些未处理的数据了

来看下StreamTask如果从chekpoint恢复的是否是如何处理的

restore方法调用了restoreGates

这里就是将数据in buffer状态的保存到InputGate, 然后out buffer 的状态数据保存到ResultPartitionWriter里面去,继续处理了

over

Flink 非对齐Unaligned的checkpoint(源码分析)的更多相关文章

  1. flink checkpoint 源码分析 (二)

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

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

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

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

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

  4. Flink源码阅读(二)——checkpoint源码分析

    前言 在Flink原理——容错机制一文中,已对checkpoint的机制有了较为基础的介绍,本文着重从源码方面去分析checkpoint的过程.当然本文只是分析做checkpoint的调度过程,只是尽 ...

  5. flink checkpoint 源码分析 (一)

    转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8029356.html checkpoint是Flink Fault Tolerance机制的重要构成 ...

  6. flink-connector-kafka consumer checkpoint源码分析

    转发请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7700600.html <flink-connector-kafka consumer的top ...

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

    通过前面的文章了解到 Driver将用户代码转换成streamGraph再转换成Jobgraph后向Jobmanager端提交 JobManager启动以后会在Dispatcher.java起来RPC ...

  8. Flink中的CEP复杂事件处理 (源码分析)

    其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的  一种重要的图  NFA非确定有限状 ...

  9. Flink集群Standalone启动脚本(源码分析)

    整个Flink集群的角色分为Jobmanager和TaskManager 以Standalone为例来看一下脚本里面是怎样启动集群的 找到源码的dist这里面包含了启动的脚本文件 standalone ...

随机推荐

  1. [BUUCTF]REVERSE——[HDCTF2019]Maze

    [HDCTF2019]Maze 附件 步骤: 例行检查,32位程序,upx壳 upx脱壳儿后扔进32位ida,首先检索程序里的字符串 有类似迷宫的字符串,下面也有有关flag的提示字符串,但是没法进行 ...

  2. 【LeetCode】163. Missing Ranges 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 遍历 日期 题目地址:https://leetcode ...

  3. 【LeetCode】400. Nth Digit 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  4. 【LeetCode】215. Kth Largest Element in an Array 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:移除最大值 方法二:排序 方法三:大顶堆 方 ...

  5. 1046:Square Number

    总时间限制: 1000ms 内存限制: 65536kB 描述 给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数 输入 多组数据,第一行T,表示数据数.对于每组数据,一行一个正整数表示b. ...

  6. 2021前端面试css(三)

    overflow 原理 块格式化上下文是css可视化渲染的一部分,它是一块区域,规定了内部块盒的渲染方式,以及浮动相互之间的影响关系,当元素设置了overflow 样式且值不为visible时,元素就 ...

  7. 编写Java程序,跑道长 50m,模拟 3 名学生同时在跑道跑步的场景 3名同学相当于3个线程对象

    查看本章节 查看作业目录 需求说明: 跑道长 50m,模拟 3 名学生同时在跑道跑步的场景 3名同学相当于3个线程对象 实现思路: 创建 Java 项目,在项目中创建StudentRunning类,该 ...

  8. JAX-MD在近邻表的计算中,使用了什么奇技淫巧?(一)

    技术背景 JAX-MD是一款基于JAX的纯Python高性能分子动力学模拟软件,应该说在纯Python的软件中很难超越其性能.当然,比一部分直接基于CUDA的分子动力学模拟软件性能还是有些差距.而在计 ...

  9. 自学java,如何快速地找到工作

    本人最近一直在帮零基础的java开发者提升能力和找工作,在这个过程中,发现零基础的java程序员,在自学和找工作时,普遍会出现一些问题,同时在实践过程中,也总结出了一些能帮零基础java开发尽快提升能 ...

  10. SpringBoot集成Actuator健康指示器health

    1.说明 本文详细介绍Actuator提供的HealthIndicators, 即健康指示器的配置使用, 利用自动配置的健康指标, 检查正在运行的应用程序的状态, 以及自定义健康指标的方法. 监控软件 ...