Flink-Barrier理解与checkpoint检查点制作过程(图解)

听说这个barrier很难理解?且听我细细道来.

目录

理解Barrier

ExactlyOnce--精准一次性--Barrier对齐

AtleastOnce--至少一次--Barrier不对齐


理解Barrier

        流的barrier是Flink的Checkpoint中的一个核心概念.多个barrier被插入到数据流中,然后作为数据流的一部分随着数据流动(有点类似于Watermark),这些barrier不会跨越流中的数据

        每个barrier会把数据流分成两部分:一部分数据进入当前的快照,另一部分数据进入下一个快照.每个barrier携带者快照的id.barrier不会暂停数据的流动,所以非常轻量级

        所以说:在流中,同一时间可以有来源于多个不同快照的多个barrier,这意味着可以并发的出现不同的快照

        光看文字可能有点不好理解,下面画个图

        在上图中,数据流中插入了barrier,意味当barrier流入到下游的算子(例如Map时),Map即需进行快照

ExactlyOnce--精准一次性--Barrier对齐

        在多并行度下,如果想要实现精准一次性,需要使用Barrier对齐

        当 job graph 中的每个 operator 接收到 barriers 时,它就会记录下其状态。拥有两个输入流的 Operators(例如CoProcessFunction)会执行 barrier 对齐(barrier alignment) 以便当前快照能够包含消费两个输入流 barrier 之前(但不超过)的所有 events 而产生的状态.

        那这句话怎么理解呢?压根看不懂啊?

        莫慌,莫慌,上图!

         在上图中,上游有两个并行度,中间都被Source Task安插了barrier,目的地是下游的Map Task

         随着数据的流动,Source①的barrier已经进入了Map中.重点来了

        此时因为规则是Barrier对齐,Map需要等待Source②的barrier也到达,才可以做快照

        并且为了保证barrier可以划分出明确的前后两个部分,在等待Source②的barrier到来的过程中,Source①流到Map的数据不会被处理

        那么有小朋友就会问了,那我不处理Source①流入的数据,那不就丢失数据了吗?这可不讲究啊

        但是咱们老实人,怎么可能就把数据给丢掉呢?  

        其实我们是把 在等待Source②过程中,Source①流入的数据,放到了一个缓存区内,等到barrier对齐之后,再把他们读出来处理.

OK!这样的话原理就讲完了,来总结一下

1.当Map收到Source①的barrier id=n 时, 它就不能处理(但是可以接收)来自该流的任何数据记录,直到它从Source②所有输入接收到 barrier id=n 为止。否则,它会混合属于快照 id=n 的记录和属于快照 id=n 的记录。
2.接收到 barrier id=n 的流(数字流)暂时被搁置。从这些流接收的记录入输入缓冲区, 不会被处理。
3.图三中的 Checkpoint barrier id=n之后的数据 234已结到达了算子, 存入到输入缓冲区没有被处理, 只有等到Source②的Checkpoint barrier id=n到达之后才会开始处理.
4.一旦最后所有输入流都接收到 barrier id=n,Operator 就会把缓冲区中 pending 的输出数据发出去,然后把 CheckPoint barrier id=n 接着往下游发送。这里还会对自身进行快照。

AtleastOnce--至少一次--Barrier不对齐

        在了解这个Barrier不对齐之前,首先咱们得明确一个事实!!!

        就是咱们在恢复故障的时候,用的是最新的,完整的checkpoint

        也就是说,那些不完整的checkpoint是不能作为恢复的依据的

        

        那么到底是啥意思?

        画个新图

         看看看,不用等对齐,就可以向下流动,在上图图3进行CK之后,如果故障重启,回到barrier的位置开始重新计算,不难发现,这个二号小方块是不是又能被算一遍???

         哟西!!!所得寺内!!

------- 以下引用他人结论

这个不对齐和上边的精准一次消费不对齐机制是不一样的。
当流速快的Barrier流到下游算子当中,此时不理会此Barrier,正常进行后续数据的计算。当流速慢的Barrier到来的时候,此时进行快照。
此时进行快照时,会把流速快的那条流中相同Barrier后的数据也进行计算一部分,然后把计算完的状态保存到状态后端。
之后进行状态恢复时,会把Barrier之后的数据进行重复,而此时状态的结果是包含一部分Barrier之后的数据的 ,此时就会造成数据的重复消费问题。
————————————————
版权声明:本文为CSDN博主「今天好好洗头了嘛」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42009405/article/details/122850469

        未对齐的检查点确保障碍尽可能快地到达接收器。 它特别适用于具有至少一个缓慢移动数据路径的应用程序,其中对齐时间可能达到数小时。

        咱们都是老实人,不能白嫖,别忘记点赞

  • 65
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Flink SQL是一个支持流和批两种模式的分布式计算框架,它能够用于各类大数据场景。Flink SQL从1.9版本开始支持基于SQL的批处理功能,最新版本的Flink SQL 1.14.0也都已经逐渐趋于完善。 对于如何从checkpoint中恢复flink-sql任务,实际上与其他flink任务的恢复方式类似。flink-sql在运行过程中,产生了各种状态,如checkpoint状态、状态后端中的状态,元数据等。当一个flink-sql任务意外停止时,重启该任务会需要使用这些状态信息来恢复任务运行的正确状态。 首先,我们需要选定需要的状态后端。Flink提供了不同的状态后端,如memory、filesystem、rocksDB等,在配置文件中选定所需的状态后端,进而启动flink-sql任务。这样flink-sql任务就会产生一系列状态信息,存储在指定的状态后端中。 其次,我们需要设置checkpoint,以保证flink-sql任务在运行过程中产生的状态信息能够被及时保存。Flink提供了不同的checkpoint触发机制,如时间间隔、数据量等,可以根据具体情况选择。 最后,在flink-sql任务出现异常中断时,可以通过使用之前保存的checkpoint状态信息来恢复flink-sql任务,保证任务持续运行。具体可以使用flink提供的命令行工具或者API进行操作。 需要注意的是,在使用flink-sql重启任务时,要确保数据源的指针位于正确的位置,否则将可能导致脏数据的产生,从而影响计算结果的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

徐一闪_BigData

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

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

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

打赏作者

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

抵扣说明:

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

余额充值