Flink 中 Checkpoint 的底层原理和机制

        Flink 的 Checkpoint 机制是 Apache Flink 在流式处理中的一个核心特性,保证了分布式数据流处理系统的 容错性。通过定期保存 状态快照(checkpoint),即使在发生故障时,Flink 也可以恢复到之前的状态,确保处理的正确性。

为了全面解释 Flink 的 Checkpoint 底层实现,下面将从 Checkpoint 的基本原理、核心组件、执行流程以及与存储和恢复的交互细节,乃至涉及的底层代码框架等多个方面展开。

1. 基本原理

        在 Flink 中,Checkpoint 机制的基本原理是通过周期性地对流式处理中的状态进行 快照,确保在节点故障或应用重启时能够恢复到最近一次的 Checkpoint,从而保证数据的一致性和任务的进度。

        Flink 的流处理是基于有状态的操作,如窗口操作、聚合函数等,这些操作需要保存中间结果(状态)。如果发生故障,Flink 通过从最近一次 Checkpoint 恢复状态,重新处理未完成的流数据。

1.1 Flink 中的 Checkpoint 与容错模型

        Flink 使用一种叫 “Chandy-Lamport 算法”(分布式系统中的一致性快照算法)来进行容错。这个算法的思想是通过发送特殊的标记事件(称为 Barrier)来标记流处理的不同阶段,从而确保在整个分布式拓扑中保存一致性的快照。

  • Barrier 是 Checkpoint 的关键,它在数据流中被插入,用于划分不同的 Checkpoint,并将每个 Checkpoint 与其后的处理数据隔离开。
  • 每当 Checkpoint 触发时,Flink 会向所有数据源发出一个 Barrier 信号,表示应该开始记录快照。
  • 每个算子(operator)在接收到 Barrier 时,会将其内部状态保存在 Checkpoint 存储中。

2. 核心组件

        Flink 的 Checkpoint 底层实现由多个核心组件组成,包括 Checkpoint CoordinatorState BackendBarrierSource FunctionOperator、以及 Task 等。每个组件在 Checkpoint 的创建、传播、存储以及恢复过程中扮演重要角色。

2.1 Checkpoint Coordinator(检查点协调器)
  • 作用:负责管理整个 Checkpoint 流程的协调工作。包括:

    1. 定期触发 Checkpoint 事件。
    2. 向所有的源算子发出 Barrier。
    3. 收集各个算子的 Checkpoint 成果。
    4. 处理故障恢复,基于 Checkpoint 恢复各个算子的状态。
  • 触发:通过 CheckpointCoordinator#triggerCheckpoint() 触发新的 Checkpoint,生成新的 CheckpointMetaData,并通过 RpcGateway 向所有 Task 发送 Checkpoint 触发指令。

源代码解析:

   CheckpointCoordinator 是 Flink 容错机制的核心类,代码位于 org.apache.flink.runtime.checkpoint 包中。其主要功能是触发和协调 Checkpoint 过程,并确保所有算子正确保存其状态。

public class CheckpointCoordinator {public CompletableFuture<CompletedCheckpoint> triggerCheckpoint(CheckpointTriggerRequest triggerRequest) {// 触发 Checkpoint 相关操作return triggerCheckpointInternal(triggerRequest,false,System.currentTimeMillis());}
}
2.2 State Backend(状态后端)
  • 作用:负责存储和管理 Flink 的有状态算子的状态。可以通过以下三种方式进行存储:

    1. MemoryStateBackend:状态存储在内存中,适合小规模状态的应用。
    2. FsStateBackend:将状态存储在分布式文件系统(如 HDFS)中。
    3. RocksDBStateBackend:将状态存储在本地 RocksDB 数据库中,适用于大规模状态。
  • 每个 Task 在执行时,会使用 StateBackend 来管理和存储状态,并在收到 Checkpoint Barrier 后,将当前状态存储到持久化存储中。

源代码解析:

   StateBackend 接口及其实现类位于 org.apache.flink.runtime.state 包中,以下是 FsStateBackend 的代码片段:

public class FsStateBackend implements StateBackend {private final Path checkpointBasePath;@Overridepublic CompletedCheckpointStorageLocation resolveCheckpoint(String checkpointPointer) throws IOException {// 状态存储在分布式文件系统中return new FsCompletedCheckpointStorageLocation(checkpointBasePath);}
}

2.3 Barrier(屏障)
  • 作用:作为 Checkpoint 流程中的同步机制,Barrier 是 Flink 的 Checkpoint 触发时在数据流中插入的特殊事件。Barrier 用于确保算子的状态在快照时刻的一致性。
  • Barrier 从源任务开始,沿着数据流传播。当一个算子接收到 Barrier 时,会暂停处理后续数据,进行状态保存,并将 Barrier 传递给下游算子。
源代码解析:

Barrier 是 Flink 的 StreamBarrier,代码位于 org.apache.flink.runtime.io.network.api 包中。

public class CheckpointBarrier extends AbstractEvent {private final long id;  // Checkpoint IDprivate final long timestamp;public CheckpointBarrier(long id, long timestamp) {this.id = id;this.timestamp = timestamp;}
}

2.4 Source Function
  • 作用:数据源(Source)是 Flink 数据处理任务的起点,负责生成并向下游发送数据记录。Source 还负责在 Checkpoint 过程中保存其自身状态(如读取的偏移量等),以便在故障发生时能够从相同的偏移量继续处理。
  • 当 CheckpointCoordinator 触发 Checkpoint 时,Source 也会记录自身状态。

3. 执行流程

Flink 的 Checkpoint 流程涉及多个阶段,从 Checkpoint 触发到状态存储的完成,具体流程如下:

3.1 Checkpoint 触发
  • CheckpointCoordinator 定期触发 Checkpoint,通过 RPC 向所有任务的执行单元发送 Barrier
  • 源任务收到 Checkpoint 触发请求后,会在数据流中插入 Barrier
3.2 Barrier 传播
  • Barrier 从源任务开始向下游传播,每个任务节点接收到 Barrier 后会将自身状态快照记录到状态后端(State Backend),然后将 Barrier 发送给下游任务。
3.3 状态保存
  • 每个有状态的任务(如 Window、KeyedState 等)在接收到 Barrier 时会触发状态快照的存储。
  • 快照可以是:
    • 内存快照:存储在内存中的状态。
    • 持久化存储:存储在分布式文件系统或 RocksDB 中的状态。
3.4 Checkpoint 完成
  • 当 CheckpointCoordinator 收到所有任务的状态保存结果后,会将这次的 Checkpoint 记录为 CompletedCheckpoint,标志着一次 Checkpoint 的成功完成。
  • 如果某个任务在 Checkpoint 过程中失败,Flink 会自动回滚到上一次成功的 Checkpoint,并重新处理故障期间的数据。

4. 故障恢复与 Checkpoint 恢复

当 Flink 任务发生故障时,Flink 会从最近一次成功的 Checkpoint 恢复。

4.1 恢复过程
  • Flink 的 CheckpointCoordinator 在故障恢复时会选择最新的 Checkpoint,并将该 Checkpoint 中保存的状态分发给相应的任务。
  • 每个任务从其对应的状态开始恢复,并且从保存的偏移量开始重新读取数据源。
4.2 状态恢复
  • 恢复时,各任务会从 State Backend 中获取之前保存的状态,Source 也会恢复到上次保存的偏移量。
  • 状态恢复后,任务重新开始处理数据,确保系统容错。

5. 底层代码结构分析

Flink 的 Checkpoint 实现分布在多个包中,主要涉及的类和接口包括:

  • CheckpointCoordinator:负责管理和触发 Checkpoint。
  • StateBackend:管理和存储任务的状态。
  • CheckpointBarrier:在数据流中插入的特殊事件,用于标识 Checkpoint 的边界。
  • CompletedCheckpoint:记录成功完成的 Checkpoint。

Flink 的 Checkpoint 机制核心代码位于 org.apache.flink.runtime.checkpoint 包中,负责协调、存储和恢复 Checkpoint 的逻辑。

总结

        Flink 的 Checkpoint 机制通过使用 Barrier 同步算法状态后端分布式协调 等底层组件来实现流式处理中的容错性。Flink 的 Checkpoint Coordinator 负责协调整个 Checkpoint 流程,Barrier 用于确保全局的一致性,而 State Backend 则负责存储各个算子的状态。在故障恢复时,Flink 能够通过最近一次的 Checkpoint 恢复状态,确保数据处理的正确性和一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1541222.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

017_FEA_CSG_in_Matlab新的统一有限元分析工作流之2D几何

Matlab新的统一有限元分析工作流 从2023a开始&#xff0c;Matlab提供了一个统一有限元分析工作流&#xff08;UFEAW&#xff0c;unified finite element analysis workflow&#xff09;。 这个新的工作留提供一个统一的接口来求解三类问题&#xff0c;并且可以用同一套数据随…

并查集(上)

并查集简要介绍&#xff1a; 我们先讲并查集的一般使用场景&#xff0c;之后再讲并查集的具体细节以及原理。 并查集的使用一般是如下的场景&#xff1a; 一开始每个元素都拥有自己的集合&#xff0c;在自己的集合里只有这个元素自己。 f i n d ( i ) find(i) find(i)&#…

数据结构之算法复杂度

目录 前言 一、复杂度的概念 二、时间复杂度 三、大O的渐进表示法 四、空间复杂度 五、常见复杂度对比 总结 前言 本文主要讲述数据结构中的算法复杂度 一、复杂度的概念 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源。因此衡量一个算法的好坏…

python源代码编译exe 防止反编译的问题

1&#xff09;使用pyinstaller 打包为exe, 记住是版本是5.*&#xff0c;我用的是5.13.2 &#xff0c;不能是6.* 这是第一步。 pyinstaller -F -i d:\whs.ico packer.py -w 2&#xff09;使用pyarmor 再次加密,我使用的版本是8.3.11&#xff0c;不是7.*&#xff0c;这是第二步…

摩托车骑行行为检测系统源码分享

摩托车骑行行为检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

Cursor Rules 让 Cursor AI 代码生成更智能、更高效,效率再次飞升!

最近,AI 代码生成工具越来越火,比如 Cursor AI 编辑器。很多开发者已经开始使用它来自动生成代码,以提高工作效率。不过你有没有发现,有时候 AI 自动生成的代码并不总是符合最佳实践?比如变量命名不够规范、代码风格不统一,或者生成的代码逻辑不够清晰。这些问题有时让人…

c# 线程等待变量的值符合条件

在C#中&#xff0c;如果你想让一个线程等待直到某个变量的值满足特定条件&#xff0c;你可以使用ManualResetEvent或者AutoResetEvent来实现线程间的同步。以下是使用AutoResetEvent实现的一个简单例子&#xff1a; 在这个例子中&#xff0c;同时实现了如何让static函数访问非…

闲鱼ip地址在哪就是人在哪吗

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;常被用于追踪用户的地理位置。然而&#xff0c;对于闲鱼这样的二手交易平台&#xff0c;用户的IP地址是否真实反映了其所在地&#xff0c;却是一个值得深入探讨的问题。本文将围绕这一话题展开&#xff0c;带…

单卡3090 选用lora微调ChatGLM3-6B

环境配置 Python 3.10.12 transformers 4.36.2 torch 2.0.1 下载demo代码 在官方网址https://github.com/THUDM/ChatGLM3/blob/main/finetune_demo 下载demo代码cd 进入文件夹 pip install -r requirements.txt 安装一些包 基本知识 SFT 全量微调: 4张显卡平均分配&#…

昂科烧录器支持ST意法半导体的电可擦除可编程存储器M95128-DFDW

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中ST意法半导体的电可擦除可编程存储器M95128-DFDW已经被昂科的通用烧录平台AP8000所支持。 M95128-DFDW是电可擦除可编程存储器&#xff08;EEPROM&#xff09;通过SPI总线进行…

springcloud微服务实战<1>

单机结构 我只需要一台服务器完成我项目的部署&#xff08;单体应用&#xff09;&#xff0c;开发部署简单 他就会有单点问题&#xff0c; 因为此时只有一台机器&#xff0c;一旦这个机器挂了&#xff0c;我用户就没有办法使用应用的服务了 这个就是单点问题针对我们的项目进…

Qt/C++ 多线程同步机制详解及应用

在多线程编程中&#xff0c;线程之间共享资源可能会导致数据竞争和不一致的问题。因此&#xff0c;采用同步机制确保线程安全至关重要。在Qt/C中&#xff0c;常见的同步机制有&#xff1a;互斥锁&#xff08;QMutex、std::mutex&#xff09;、信号量&#xff08;QSemaphore&…

多模态大模型MiniCPM-V技术学习

目前性价比最高的多模态模型 Minicpm-V-2.6参数8B&#xff0c;int4版本推理显存仅7GB&#xff0c;并且在幻觉数据集上效果好于其他模型&#xff0c;测试下来效果非常好&#xff0c;官方演示里面还给出了手机上端侧运行的图片和视频推理示例 p.s.Qwen2-VL和Minicpm-V-2.6头对头…

【操作系统】02.深入理解操作系统

一、操作系统的定位 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。笼统的理解&#xff0c;操作系统包括操作系统内核和其他程序。 由上述的宏观图其实我们就知道&#xff1a;操作系统是一款进行软硬件资源管理的软件。 二、设计操作系统的目的 操…

众数信科AI智能体政务服务解决方案——寻知智能笔录系统

政务服务解决方案 寻知智能笔录方案 融合民警口供录入与笔录生成需求 2分钟内生成笔录并提醒错漏 助办案人员二次询问 提升笔录质量和效率 寻知智能笔录系统 众数信科AI智能体 产品亮点 分析、理解行业知识和校验规则 AI实时提醒用户文书需注意部分 全文校验格式、内…

C一语言—动态内存管理

目录 一、为什么要有动态内存管理 二、malloc和free &#xff08;2.1&#xff09;malloc &#xff08;2.2&#xff09;free 三、calloc和realloc &#xff08;3.1&#xff09;calloc &#xff08;3.2&#xff09;realloc 四、常见的动态内存的错误&#xff08;举例均为错…

springboot每次都需要重设密码?明明在springboot的配置中设置了密码

第一步&#xff1a;查看当前的密码是什么&#xff1f; 打开redis-cli.exe&#xff0c;输入config get requirepass&#xff0c;查看当前的密码是什么&#xff1f; 接着&#xff0c;修改redis的配置文件&#xff0c;找到redis的安装目录&#xff0c;找到相关的conf文件&#x…

Amazon Bedrock 模型微调实践(二):数据准备篇

本博客内容翻译自作者于 2024 年 9 月在亚马逊云科技开发者社区发表的同名博客&#xff1a; “Mastering Amazon Bedrock Custom Models Fine-tuning (Part 2): Data Preparation for Fine-tuning” 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、…

Unity3D入门(一) : 第一个Unity3D项目,实现矩形自动旋转,并导出到Android运行

1. Unity3D介绍 Unity3D是虚拟现实行业中&#xff0c;使用率较高的一款软件。 它有着强大的功能&#xff0c;是让玩家轻松创建三维视频游戏、建筑可视化、实时三维动画等互动内容的多平台、综合型 虚拟现实开发工具。是一个全面整合的专业引擎。 2. Unity安装 官网 : Unity…

1042 Shuffling Machine,1050 String Subtractio

1042 Shuffling Machine 普通模拟即可&#xff0c;注意每一次交换牌的时候需要更新start数组&#xff08;当前卡牌的顺序&#xff09;&#xff0c;并且清空ans数组&#xff08;交换后的卡牌顺序&#xff09; #include<bits/stdc.h> using namespace std; const int N 5…