【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获取StateBackendfinal StateBackend fromApplication = configuration.getStateBackend(getUserCodeClassLoader());//2. 通过应用配置还是通过集群默认配置创建StateBackendreturn 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中反序列化出StateBackendbackend = ((ConfigurableStateBackend) fromApplication).configure(config, classLoader);}else {backend = fromApplication;}}else {//检查是否开启StateBackend默认配置final StateBackend fromConfig = loadStateBackendFromConfig(config, classLoader, logger);if (fromConfig != null) {backend = fromConfig;} else {//2. 如果配置为空则,创建默认MemoryStateBackendbackend = 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设计与实现:核心原理与源码解析》–张利兵

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

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

相关文章

真正免费的文件恢复软件easyrecovery2024中文版

easyrecovery数据恢复软件是一款广受好评的数据恢复工具,它能够有效地帮助用户恢复各种类型的文件。无论是照片、视频、音乐还是文档,都能轻松地找回这些重要文件。操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删…

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

申请SSL证书怎么进行域名验证?域名验证的三种方式

SSL证书是用于加密和保护Web服务器和浏览器之间通信的数字证书&#xff0c;在申请SSL证书时&#xff0c;为了防止域名被冒用&#xff0c;对于申请SSL证书的域名&#xff0c;要求先验证这个域名的所有权。而目前可用的域名验证SSL证书方式有三种&#xff1a;分别是DNS验证、邮箱…

Kubernetes实战(二十七)-HPA实战

1 HPA简介 HPA 全称是 Horizontal Pod Autoscaler&#xff0c;用于POD 水平自动伸缩&#xff0c; HPA 可以 基于 POD CPU 利用率对 deployment 中的 pod 数量进行自动扩缩容&#xff08;除了 CPU 也可以基于自定义的指标进行自动扩缩容&#xff09;。pod 自动缩放不适用于无法…

fast table行的自动扩大

首先选择行 选择表格或其任何元素&#xff0c;并将光标置于所需行的左侧。光标的形式将变为一个黑色小箭头&#xff1a; 单击鼠标左键&#xff0c;以选择行&#xff1b; 右击鼠标&#xff0c;显示该行的右键菜单 最好的行分断 第 [ToInt32([Page])-4] 页

同步和异步、阻塞与非阻塞

一、同步和异步的概念 首先同步和异步是访问数据的机制 同步&#xff1a;同步一般指主动请求并等待IO操作完成的方式异步&#xff1a;主动请求数据后便可以继续处理其它任务&#xff0c;随后等待IO操作完毕的通知 两者的区别&#xff1a;同步会一行一行执行代码&#xff0c;而…

江科大STM32 终

目录 SPI协议10.1 SPI简介W25Q64简介10.3 SPI软件读写W25Q6410.4 SPI硬件外设读写W25Q64 BKP备份寄存器、PER电源控制器、RTC实时时钟11.0 Unix时间戳代码示例&#xff1a;读写备份寄存器BKP11.2 RTC实时时钟 十二、PWR电源控制12.1 PWR简介代码示例&#xff1a;修改主频12.3 串…

形态学算法应用之连通分量提取的python实现——图像处理

原理 连通分量提取是图像处理和计算机视觉中的一项基本任务&#xff0c;旨在识别图像中所有连通区域&#xff0c;并将它们作为独立对象处理。在二值图像中&#xff0c;连通分量通常指的是所有连接在一起的前景像素集合。这里的“连接”可以根据四连通或八连通的邻接关系来定义…

【大厂AI课学习笔记】【1.5 AI技术领域】(9)机器翻译

今天学习的是机器翻译。 关注我&#xff0c;我会将全部的脑图&#xff0c;在本内容完结的时候&#xff0c;发到资源共享中。 Machine Translation&#xff0c;属于计算机语言学的范畴&#xff0c;利用计算机程序将文字或者演说从一种语言翻译成另一种语言。 使用一种基于语言…

R语言rmarkdown使用

1、安装 install.packages(rmarkdown) library(rmarkdown) install.packages(tinytex) tinytex::install_tinytex() 2、新建R Markdown 3、基本框架 红色框内为YAML&#xff1a;包括标题、作者和日期等 黄色框内为代码块&#xff1a;执行后面的代码&#xff0c;并可以设置展…

Git详细讲解

文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作&#xff08;git commit&#xff09;2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…

供应链领域数据中台架构建设(上)

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 关注我&#xff0c;紧跟本系列专栏文章&#xff0c;咱们下篇再续&#xff01; 作者简介&#xff1a;魔都国企技术专家兼架构&#xff0c;多家大厂后端一线研发经验&#xff0c;各大技术社区…

【linux开发工具】vim详解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 “学如逆水行舟&#xff0…

【图形图像的C++ 实现 01/20】 2D 和 3D 贝塞尔曲线

目录 一、说明二、贝塞尔曲线特征三、模拟四、全部代码如下 一、说明 以下文章介绍了用 C 计算和绘制的贝塞尔曲线&#xff08;2D 和 3D&#xff09;。    贝塞尔曲线具有出色的数学能力来计算路径&#xff08;从起点到目的地点的曲线&#xff09;。曲线的形状由“控制点”决…

Airtest实现在手机界面快速批量采集数据

Airtest实现在手机界面快速批量采集数据 一、问题 Airtest使用的poco方法比较慢&#xff0c;寻找差不多一周&#xff0c;看完这篇文章能节省一周时间&#xff0c;希望帮到大家。 二、解决思路 使用Airtest图像识别&#xff0c;这样就会速度上提升效率。 三、解决办法 使用页…

【数据结构】堆(创建,调整,插入,删除,运用)

目录 堆的概念&#xff1a; 堆的性质&#xff1a; 堆的存储方式&#xff1a; 堆的创建 &#xff1a; 堆的调整&#xff1a; 向下调整&#xff1a; 向上调整&#xff1a; 堆的创建&#xff1a; 建堆的时间复杂度&#xff1a; 向下调整&#xff1a; 向上调整&#xff…

Nature Machine Intelligence 使用机器学习驱动的可拉伸智能纺织手套捕捉复杂的手部动作和物体交互

研究背景 对灵巧手运动的精确实时跟踪在人机交互、元宇宙、机器人和远程医疗等领域有着广泛的应用。当前的可穿戴设备中的大多数仅用于检测精度有限的特定手势&#xff0c;并且没有解决与设备的可靠性、准确性和可清洗相关的挑战。对传感器直接放置在用户的手上有严格的要求&am…

3.2 Verilog 时延

关键词&#xff1a;时延&#xff0c; 惯性时延 连续赋值延时语句中的延时&#xff0c;用于控制任意操作数发生变化到语句左端赋予新值之间的时间延时。 时延一般是不可综合的。 寄存器的时延也是可以控制的&#xff0c;这部分在时序控制里加以说明。 连续赋值时延一般可分为…

懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.

Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…

2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口

文章目录 1 特殊文件夹 Editor2 在 Unity 菜单栏中添加自定义页签3 在 Hierarchy 窗口中添加自定义页签4 在 Project 窗口中添加自定义页签5 在菜单栏的 Component 菜单添加脚本6 在 Inspector 为脚本右键添加菜单7 加入快捷键8 小结 1 特殊文件夹 Editor ​ Editor 文件夹是 …