首页 > 其他分享 >【Flink入门修炼】2-3 Flink Checkpoint 原理机制

【Flink入门修炼】2-3 Flink Checkpoint 原理机制

时间:2024-04-25 20:58:54浏览次数:19  
标签:状态 入门 barrier Flink Checkpoint 数据 节点

如果让你来做一个有状态流式应用的故障恢复,你会如何来做呢?
单机和多机会遇到什么不同的问题?
Flink Checkpoint 是做什么用的?原理是什么?

一、什么是 Checkpoint?

Checkpoint 是对当前运行状态的完整记录。程序重启后能从 Checkpoint 中恢复出输入数据读取到哪了,各个算子原来的状态是什么,并继续运行程序。
即用于 Flink 的故障恢复。
这种机制保证了实时程序运行时,即使突然遇到异常也能够进行自我恢复。

二、如何实现 Checkpoint 功能?

如果让你来设计,对于流式应用如何做到故障恢复?
我们从最简单的单机单线程看起。

一)单机情况

同步执行,每次只处理一条数据

image.png

很简单,这种情况下,整个流程一次只处理一条数据。

  • 数据到 Write 阶段结束,各个算子记录一次各自状态信息(如读取的 offset、中间算子的状态)
  • 遇到故障需要恢复的时候,从上一次保存的状态开始执行
  • 当然为了降低记录带来的开销,可以攒一批之后再记录。

同时处理多条数据

每个计算节点还是只处理一条数据,但该节点空闲就可以处理下一条数据。
image.png

如果还按照一个数据 Write 阶段结束开始保存状态,就会出现问题:

  • 前面节点的状态,在处理下一个数据时被改过了
  • 从此时保存的记录恢复,前面的节点会出现重复处理的问题
  • 此时被称为 - 确保数据不丢(At Least Once)

一种解决方式:

  • 在输入数据中,定期插入一个 barrier
  • 各算子遇到 barrier 就开始做状态保留,并且不再接收新数据的计算。
  • 当前算子状态保留后,将 barrier 传递给下一个算子,并重复上面的步骤。
  • 当 barrier 传递到最后一个算子,并完成状态保留后,本次状态保留完成。

这样,各个节点保存的都是相同数据节点时的状态。
故障恢复时,能做到不重复处理数据,也就是精确一次(Exactly-once)。
image.png

但这里,你可能会发现一个问题:

  • 数据已经写出了怎么办?在两个保存点之间,已经把结果写到外部了,重启后不是又把部分数据再写了一次?

这里实际是「程序内部精确一次」「端到端精确一次」
那么如何做到「端到端精确一次」?

  • 方案一:最后一个 sink 算子不直接向外部写出,等到 barrier 来了,才把这一批数据批量写出去
  • 方案二:两阶段提交。需要 sink 端支持(如 kafka)。
    • 方式类似于 MySQL 的事务。
    • sink 端正常向外部写出,不过输出端处于 pre-commit 状态,这些数据还不可读取
    • 当 sink 端等到 barrier 时,将输出端数据变为 committed,下游输出端的数据才正式可读

不过以上方法为了做到端到端精确一次,会带来数据延迟问题。(因为要等 Checkpoint 做完,数据才实际可读)。

解决数据延迟有一种方案:

  • 方案:幂等写入。同样一条数据,无论写入多少次对输出端看来都是一样的。(比如按照主键重复写这一条数据,并且数据本身没变化)

二)重要概念介绍

一致性级别

前面的例子中,我们提到了部分一致性级别,这里我们总结下。在流处理中,一致性可以分为 3 个级别:

  • at-most-once(最多一次): 这其实是没有正确性保障的委婉说法——故障发生之后,计数结果可能丢失。
  • at-least-once (至少一次): 这表示计数结果可能大于正确值,但绝不会小于正确值。也就是说,计数程序在发生故障后可能多算,但是绝不会少算。
  • exactly-once (精确一次): 这指的是系统保证在发生故障后得到的计数结果与正确值一致。恰好处理一次是最严格的保证,也是最难实现的。

按区间分:

  • 程序(Flink)内部精确一次
  • 端到端精确一次

Checkpoint 中保留的是什么信息?

标签:状态,入门,barrier,Flink,Checkpoint,数据,节点
From: https://www.cnblogs.com/shuofxz/p/18158541

相关文章

  • 【vue3入门】-【2】文本插值
    文本插值最基本的数据绑定形式是文本插值,它使用的是”Mustache“语法(即双大括号)<script>exportdefault{data(){return{msg:"神奇的语法"}}}//以上为文本插值的固定使用格式</script><template><h3>模版语法</h3><p>{{msg}}</p></templ......
  • 【vue3入门】-【3】使用javascript表达式
    使用javascript表达式每个绑定仅支持单一表达式,也就是一段能够被求值的JavaScript代码。一个简单的判断方法是是否可以合法的写在return后面。<template><h3>模版语法</h3><p>{{msg}}</p><p>{{number+1}}</p><p>{{ok?"yes":"No"}}</......
  • 【vue3入门】-【4】插入html
    原始html双大括号,将会将数据插值为纯文本,而不是html,若想要插入html,则需要使用v-html指令<template><h3>模版语法</h3><p>{{tthtml}}</p><!--会直接将html文本展示出来-->><pv-html="tthtml"></p><!--会在进行渲染后展示出来-->></templa......
  • FLINKCDC 3.0整库同步MYSQL至DORIS(FLINK1.18): 历程
    大数据技术涉及组件较多,各个环境较DEMO又不尽相同,所以参照DEMO进行,任然很多报错信息出现。如下报错处理,尽供参考:1.创建同步配置文件################################################################################Description:SyncMySQLalltablestoDoris#########......
  • 【vue-入门】-【1】Vue介绍与项目结构
    Vue是什么?渐进式javaScript框架,易学易用,性能出色,适用场景丰富的web框架官方文档地址:https://cn.vuejs.orgVue简介是渐进式javascript框架,易学易用,性能出色,适用场景丰富的web前端框架Vue是一款用于构建用户节点的javascript框架。它基于标准html、css、javascript构建并提......
  • 快速入门
    快速入门‍为什么不用Pyqt6,非要用PySide6开发程序呢?因为PySide6是Qt官方维护的py库,Pyqt6如果用于商业需要购买许可证,而PySide6的LGPL许可证,允许商业、非商业、开源或非开源。当然,PyQt6和PySide6大部分函数是一致的,网上的PyQt教程也比较丰富,可以先练习PyQt,发布源码时转为PySide6......
  • 三十分钟入门基础Go(Java小子版)
    前言Go语言定义Go(又称Golang)是Google的RobertGriesemer,RobPike及KenThompson开发的一种静态、强类型、编译型语言。Go语言语法与C相近,但功能上有:内存安全,GC,结构形态及CSP-style并发计算。适用范围本篇文章适用于学习过其他面向对象语言(Java、Php),但没有学过......
  • 在flink消费一段时间kafka后,kafka-group的offset被重置了是怎么回事?
    一、背景腾讯Flink使用KafkaSourceAPI创建source端,源码中默认开启了checkpoint的时候提交offset到kafka-broker。读取kafka数据写入到iceberg目前发现一个问题,就是消费数据的时候,消费一段时间后,kafka-group的offset就重置了,看起来像重置到earliest了,导致消费数据激增二......
  • 使用dolphinscheduler调度flink实时任务
    1.在“项目管理”>>"工作流定义"里边创建工作流2.选择flink_stream3.选择安装flink服务的节点worker分组程序类型选择sql4.在“脚本”编写框输入flink-sql主代码5.选择flink版本,指定任务名称,配置资源参数最后点击确认保存6.在任务定义>>实时任务列表找到刚......
  • k8s 入门
    k8s是什么?k8s介于应用和服务器之间,能够通过配置协调多个应用服务。使用者通过配置yaml文件来将多个服务自动部署应用到各个服务器上,实现服务的自动扩缩容,并且具有高可用性(某台机器上服务宕机后,自动在另外的服务器上部署应用)。k8s架构原理k8s整体分为控制平面和运行节点,控......