【flink状态管理(三)】StateBackend的整体设计、StateBackend创建说明

文章目录

  • 一. 状态后端概述
  • 二. StateBackend的整体设计
    • 1. 核心功能
    • 2. StateBackend的UML
    • 3. 小结
  • 三. StateBackend的加载与初始化
    • 1. StateBackend创建概述
    • 2. StateBackend创建过程

一. 状态后端概述

StateBackend作为状态存储后端,提供了创建和获取KeyedStateBackend及OperatorStateBackend的方法,并通过CheckpointStorage实现了对状态数据的持久化存储。

Flink支持MemoryStateBackend、FsStateBackend和RocksDBStateBackend三种类型的状态存储后端,三者的主要区别在于创建的KeyedStateBackend及CheckpointStorage不同。例如,MemoryStateBackend和FileStateBackend创建的是HeapKeyedStateBackend,RocksDBStateBackend创建的是RocksDBKeyedStateBackend。

本文关注StateBackend的设计与实现。

二. StateBackend的整体设计

1. 核心功能

在StateBackend接口中提供了如下核心功能。

  • resolveCheckpoint()方法用于获取Checkpoint的Location信息,Location信息包含Checkpoint元数据信息;
  • createCheckpointStorage()方法为Job创建CheckpointStorage对象,CheckpointStorage提供写入Checkpoint数据和元数据信息的能力;
  • createKeyedStateBackend()方法用于创建KeyedStateBackend,KeyedStateBackend提供创建和管理KeyedState的能力;
  • createOperatorStateBackend()方法主要用于创建OperatorStateBackend,通过OperatorStateBackend可以创建和管理OperatorState状态数据。

 

2. StateBackend的UML

StateBackend主要有AbstractStateBackend基本实现类,该类中没有提供实质性的方法,主要为了向前(ing)兼容。

AbstractFileStateBackend有MemoryStateBackend和FsStateBackend两种实现类,其中MemoryStateBackend主要通过JobManager堆内存存储Checkpoint数据,FsStateBackend通过FsCheckpointStorage将Checkpoint数据存储在指定文件系统中。

在这里插入图片描述

 

RockdsDBStateBackend也实现了StateBackend的基本功能,

  • 内存状态:和其他状态管理后端不同的是,它创建的KeyedStateBackend是基于RocksDB实现的RocksDBKeyedStateBackend。KeyedState数据都会存储在RocksDB内存中。
  • 持久化:对于CheckpointStorage的创建,RocksDBStateBackend依赖于FsStateBackend,即基于文件系统对Checkpoint中的状态数据进行持久化。

 

3. 小结

StateBackend提供了创建CheckpointStorage、KeyedStateBackend及OperatorStateBackend的功能。

基于MemoryStateBackend可以实现非常高效的状态数据获取和存储,但由于JobManager内存数量有限,对比较大的状态数据无法提供更好的支持。对于RocksDBStateBackend而言,可以基于RocksDB提供的LSM-Tree(Log StructuredMerge-Tree)内存数据结构,实现更加高效的堆外内存访问,支持大数据量的状态数据存储,这对生产环境来讲是一个更优的选择。

 

三. StateBackend的加载与初始化

1. StateBackend创建概述

StateBackend主要通过StateBackendFactory接口创建。StateBackendFactory主要有MemoryStateBackendFactory、FsStateBackendFactory和RocksDBStateBackendFactory三种实现,最终通过StateBackendFactory的不同实现类创建相应的StateBackend。
在这里插入图片描述

StateBackendFactory主要通过StateBackendLoader进行加载和创建。StateBackendLoader会根据state.backend的名称使用Java SPI技术加载相应类型的StateBackendFactory,最终创建StateBackend。

 

2. StateBackend创建过程

StateBackend会在两个过程中创建:

  • 首先,在JobMaster根据JobGraph对象创建ExecutionGraph的过程中会创建StateBackend,用于CheckpointCoordinator组件管理状态和Checkpoint操作;
  • 其次,在每个Task实例初始化的过程中会创建StateBackend,用于管理当前Task中的状态和Checkpoint数据。

接下来我们分步骤看StateBackend的创建过程。

1)在StreamTask中初始化StateBackend

前面我们已经知道,当StreamTask在TaskManager的Task线程中启动时,会调用invoke()抽象方法运行StreamTask中的算子。此时在beforeInvoke()方法中就会调用StreamTask.createStateBackend()方法创建当前Task中使用的StateBackend。

在StreamTask.createStateBackend()方法中可以看出,

//
private StateBackend createStateBackend() throws Exception {
   //1. 从UserCodeClassLoader获取StateBackend
   final StateBackend fromApplication = 
      configuration.getStateBackend(getUserCodeClassLoader());
   //2. 通过应用配置还是通过集群默认配置创建StateBackend
   return StateBackendLoader.fromApplicationOrConfigOrDefault(
         fromApplication,
         getEnvironment().getTaskManagerInfo().getConfiguration(),
         getUserCodeClassLoader(),
         LOG);
  //用户在代码中调用StreamExecutionEnvironment.enableCheckpointing()方法时,
  //系统默认配置主要是通过flink-conf.yaml启用StateBackend配置项。
}

 
2)StateBackendLoader加载配置的StateBackend

public static StateBackend fromApplicationOrConfigOrDefault(
      @Nullable StateBackend fromApplication,
      Configuration config,
      ClassLoader classLoader,
      @Nullable Logger logger) 
   throws IllegalConfigurationException, DynamicCodeLoadingException, IOException {
   checkNotNull(config, "config");
   checkNotNull(classLoader, "classLoader");
   final StateBackend backend;
   // 1) 如果应用配置的StateBackend不为空,则最高优先级是应用中定义的
   //StateBackend实现类。
   if (fromApplication != null) {
      if (logger != null) {
         logger.info("Using application-defined state backend: {}", fromApplication);
      }
      // 向fromApplication中追加额外的参数配置
      if (fromApplication instanceof ConfigurableStateBackend) {
         if (logger != null) {
            logger.info("Configuring application-defined state backend with 
               job/cluster config");
         }
         // 直接从UserClassLoader中反序列化出StateBackend
         backend = ((ConfigurableStateBackend) fromApplication)
            .configure(config, classLoader);
      }
      else {
         backend = fromApplication;
      }
   }
   else {
      //检查是否开启StateBackend默认配置
      final StateBackend fromConfig = 
          loadStateBackendFromConfig(config, classLoader, logger);
      if (fromConfig != null) {
         backend = fromConfig;
      } else {
         //2. 如果配置为空则,创建默认MemoryStateBackend
         backend = new MemoryStateBackendFactory().createFromConfig(config, 
            classLoader);
         if (logger != null) {
            logger.info("No state backend has been configured, using default 
               (Memory / JobManager) {}", backend);
         }
      }
   }
   return backend;
}

 
3)通过StateBackendFactory创建StateBackend
这里举例说明MemoryStateBackend的创建过程。从方法中,调用了MemoryStateBackend()构造器创建基于堆内存的StateBackend,并调用configure()方法对StateBackend进行参数配置。

public MemoryStateBackend createFromConfig(Configuration config, ClassLoader 
   classLoader) {
   return new MemoryStateBackend().configure(config, classLoader);
}

 
《Flink设计与实现:核心原理与源码解析》–张利兵

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【51单片机】实现一个动静态数码管显示项目(超全详解&代码&图示)(5)

前言 大家好吖,欢迎来到 YY 滴单片机 系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY…

vue项目打包部署到flask等后端服务里面,实现前后端不分离部署,解决空白页面和刷新页面not fount问题

1. 编译模式一定要设置为esnext,否则会报错: Strict MIME type checking is enforced for module scripts per HTML spec.Expected a JavaScript module script but the server responded with a MIME type of "text/plain". 具体解释可以看vi…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接: 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record,示例内容如下:。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

PyTorch深度学习实战(23)——从零开始实现SSD目标检测

PyTorch深度学习实战(23)——从零开始实现SSD目标检测 0. 前言1. SSD 目标检测模型1.1 SSD 网络架构1.2 利用不同网络层执行边界框和类别预测1.3 不同网络层中默认框的尺寸和宽高比1.4 数据准备1.5 模型训练 2. 实现 SSD 目标检测2.1 SSD300 架构2.2 Mul…

深度学习的新进展:解析技术演进与应用前景

深度学习的新进展:解析技术演进与应用前景 深度学习,作为人工智能领域的一颗璀璨明珠,一直以来都在不断刷新我们对技术和未来的认知。随着时间的推移,深度学习不断迎来新的进展,这不仅推动了技术的演进,也…

Vue中路由守卫的详细应用

作为一名web前端开发者,我们肯定经常使用Vue框架来构建我们的项目。而在Vue中,路由是非常重要的一部分,它能够实现页面的跳转和导航,提供更好的用户体验。然而,有时我们需要在路由跳转前或跳转后执行一些特定的逻辑&am…

vue3项目中的404页面

vue3项目中的404页面 春节前的最后一篇技术博客了 写了不少vue项目,发现一直没有正确处理404页面。404页面的出现有这么几种可能: 错误输入了页面地址路由连接跳转时,某些路由已经不存在了,而程序员并没有正确处理 也就是说40…

C 语言学习七:指针

指针 指针与地址指针的声明和初始化指针的解引用指针的比较指针和数组指针数组指针和动态内存分配 指针与函数参数指针作为函数参数二级指针 指向函数的指针 指针与地址 指针的声明和初始化 int variable 42; int *ptr &variable; //间接访问 int value *ptr; // valu…

【竞技宝】LOL:369兰博豪取四杀带队翻盘 TES2-0轻取WBG

北京时间2024年2月8日,英雄联盟LPL2024春季赛在昨天迎来第三周第三个比赛日,本日第二场比赛由TES对阵WBG。本场比赛TES中后期团战的处理更加出色,第二局更是在后期凭借369兰博的四杀完成翻盘,TES2-0轻取WBG。以下是本场比赛的详细…

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下: text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离,允许负值,必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…

GEE详细教程之:将Landsat8与Landsat9影像合成一个影像

1.前言 因项目需求,需要获取一个研究区的Landsat8影像,但Landsat8重复周期长,加之天气的影响,很难获取影像质量较好的影像。Landsat4/5/7的波段顺序与landsat8不同,除此之外,landsat7影像还需要工具进行条带…

222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目描述 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干…

重装系统---首次安装java的JDK

1、去官网或者百度资源选择自己想要下载的jdk版本即可 2、 3、按照步骤安装即可,路径不要更改,默认c盘安装就好,避免后面发生错误。 4、打开电脑的设置,编辑环境变量 这是添加之后的效果 5、再新建一个系统环境变量 6、编辑环境变量Path 添

3.3-媒资管理之MinIo分布式文件系统上传视频

文章目录 媒资管理5 上传视频5.1 需求分析5.2 断点续传技术5.2.1 什么是断点续传5.2.2 分块与合并测试5.2.3 视频上传流程5.2.4 minio合并文件测试 5.3 接口定义5.4 上传分块开发5.4.1 DAO开发5.4.2 Service开发5.4.2.1 检查文件和分块5.4.2.2 上传分块5.4.2.3 上传分块测试 5.…

Ubuntu安装SVN服务并结合内网穿透实现公网访问本地存储文件

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

2. Maven 继承与聚合

目录 2. 2.1 继承 2.2继承关系 2.2.1 思路分析 2.2.2 实现 2.1.2 版本锁定 2.1.2.1 场景 2.1.2.2 介绍 2.1.2.3 实现 2.1.2.4 属性配置 2.2 聚合 2.2.1 介绍 2.2.2 实现 2.3 继承与聚合对比 maven1:分模块设计开发 2. 在项目分模块开发之后啊&#x…

【Qt学习笔记】Qt Creator环境下 信号与槽 详解(自定义信号槽、断连、lambda表达式等)

文章目录 1. 信号槽概念1.1 信号的本质1.2 槽的本质1.3 标准信号槽1.4 信号槽 实例 2. 自定义信号槽2.1 自定义槽函数2.2 自定义信号2.3 带参 信号槽 3. 信号槽的意义 与 作用4. 信号槽断连 (了解)5. lamda表达式的使用5.1 基本用法5.2 捕获局部变量5.3 …

代码随想录算法训练营DAY16 | 二叉树 (3)

一、LeetCode 104 二叉树的最大深度 题目链接:104.二叉树的最大深度https://leetcode.cn/problems/maximum-depth-of-binary-tree/ 思路:采用后序遍历递归求解。 class Solution {int ans 0;public int maxDepth(TreeNode root) {if(root null){retur…

阿里云学生服务器完成验证领取300元无门槛代金券和优惠权益

阿里云高校计划「云工开物」学生和教师均可参与,完成学生认证和教师验证后学生可以免费领取300元无门槛代金券和3折优惠折扣,适用于云服务器等全量公共云产品,订单原价金额封顶5000元/年,阿里云百科aliyunbaike.com分享阿里云高校…

2024等保贯穿总结

严重不符合项: 离职人员不能在报告上签字!!!因为人员离职导致测评人员不够的(会开观察项) 业务受理人员:管合同的人员、签合同的人员、市场部和人员有关的人员都要写进来 签字的人员一定要有相…