首页/新闻资讯/正文详情

【flink状态管理(四)】MemoryStateBackend的实现

发布时间:2026/11/3 9:11:54 来源:云帆数科 栏目:资讯中心
【flink状态管理(四)】MemoryStateBackend的实现
文章目录1.基于MemoryStateBackend创建KeyedStateBackend1.1. 状态初始化1.2. 创建状态2. 基于MemoryStateBackend创建OperatorStateBackend3.基于MemoryStateBackend创建CheckpointStorage在Flink中默认的StateBackend实现为MemoryStateBackend本文以MemoryStateBackend为例说明StateBackend的设计与实现。本文介绍MemoryStateBackend中如下三个主要组件的创建过程HeapKeyedStateBackendOperatorStateBackendMemoryBackendCheckpointStorageFsStateBackend和RocksDBStateBackend这两种状态后端存储的实现功能和MemoryStateBackend类似区别在于内部创建的KeyedStateBackend和CheckpointStorage。1.基于MemoryStateBackend创建KeyedStateBackend1.1. 状态初始化AbstractStreamOperator.keyedStatedBackend()方法定义了创建和初始化KeyedStatedBackend的逻辑具体如下。protectedKAbstractKeyedStateBackendKkeyedStateBackend(TypeSerializerKkeySerializer,StringoperatorIdentifierText,PrioritizedOperatorSubtaskStateprioritizedOperatorSubtaskStates,CloseableRegistrybackendCloseableRegistry,MetricGroupmetricGroup)throwsException{if(keySerializernull){returnnull;}StringlogDescriptionkeyed state backend for operatorIdentifierText;//1.TaskInfotaskInfoenvironment.getTaskInfo();finalKeyGroupRangekeyGroupRangeKeyGroupRangeAssignment.computeKeyGroupRangeForOperatorIndex(taskInfo.getMaxNumberOfParallelSubtasks(),taskInfo.getNumberOfParallelSubtasks(),taskInfo.getIndexOfThisSubtask());// 确保恢复状态过程中构建的数据流被关闭CloseableRegistrycancelStreamRegistryForRestorenewCloseableRegistry();backendCloseableRegistry.registerCloseable(cancelStreamRegistryForRestore);// 创建BackendRestorerProcedureBackendRestorerProcedureAbstractKeyedStateBackendK,KeyedStateHandlebackendRestorernewBackendRestorerProcedure((stateHandles)-stateBackend.createKeyedStateBackend(environment,environment.getJobID(),operatorIdentifierText,keySerializer,taskInfo.getMaxNumberOfParallelSubtasks(),keyGroupRange,environment.getTaskKvStateRegistry(),TtlTimeProvider.DEFAULT,metricGroup,stateHandles,cancelStreamRegistryForRestore),backendCloseableRegistry,logDescription);try{returnbackendRestorer.createAndRestore(prioritizedOperatorSubtaskStates.getPrioritizedManagedKeyedState());}finally{if(backendCloseableRegistry.unregisterCloseable(cancelStreamRegistryForRestore)){IOUtils.closeQuietly(cancelStreamRegistryForRestore);}}}获取当前Task的TaskInfo并基于TaskInfo的参数创建KeyGroupRange表示当前Task实例中存储的Key分组区间。创建CloseableRegistry并注册到backendCloseableRegistry中用于确保在任务取消的情况下关闭在恢复状态过程中构造的数据流。创建BackendRestorerProcedure提供了stateBackend.createKeyedStateBackend()方法也包含恢复历史状态数据的方法。创建KeyedStateBackend同时对状态数据进行恢复。prioritizedOperatorSubtaskStates是从TaskStateManager中根据OperatorID获取的算子历史状态通过prioritizedOperatorSubtaskStates获取当前算子的PrioritizedManagedKeyedState并基于这些状态数据恢复算子的状态。1.2. 创建状态接下来我们看MemoryStateBackend.createKeyedStateBackend()方法的具体实现。publicKAbstractKeyedStateBackendKcreateKeyedStateBackend(Environmentenv,JobIDjobID,StringoperatorIdentifier,TypeSerializerKkeySerializer,intnumberOfKeyGroups,KeyGroupRangekeyGroupRange,TaskKvStateRegistrykvStateRegistry,TtlTimeProviderttlTimeProvider,MetricGroupmetricGroup,NonnullCollectionKeyedStateHandlestateHandles,CloseableRegistrycancelStreamRegistry)throwsBackendBuildingException{// 获取TaskStateManager实例TaskStateManagertaskStateManagerenv.getTaskStateManager();// 创建HeapPriorityQueueSetFactory实例HeapPriorityQueueSetFactorypriorityQueueSetFactorynewHeapPriorityQueueSetFactory(keyGroupRange,numberOfKeyGroups,128);// 创建HeapKeyedStateBackendBuilder实例HeapKeyedStateBackendreturnnewHeapKeyedStateBackendBuilder(kvStateRegistry,keySerializer,env.getUserClassLoader(),numberOfKeyGroups,keyGroupRange,env.getExecutionConfig(),ttlTimeProvider,stateHandles,AbstractStateBackend.getCompressionDecorator(env.getExecutionConfig()),taskStateManager.createLocalRecoveryConfig(),priorityQueueSetFactory,isUsingAsynchronousSnapshots(),cancelStreamRegistry).build();}从environment参数中获取TaskStateManager实例创建HeapPriorityQueueSetFactory实例用于生成HeapPriorityQueueSet优先级队列存储TimerHeapInternalTimer等数据。调用HeapKeyedStateBackendBuilder.build()方法创建HeapKeyedStateBackend。2. 基于MemoryStateBackend创建OperatorStateBackend和创建KeyedStateBackend的过程相似AbstractStreamOperator.operatorStateBackend()方法实现了创建OperatorStateBackend的方法。protectedOperatorStateBackendoperatorStateBackend(StringoperatorIdentifierText,PrioritizedOperatorSubtaskStateprioritizedOperatorSubtaskStates,CloseableRegistrybackendCloseableRegistry)throwsException{StringlogDescriptionoperator state backend for operatorIdentifierText;CloseableRegistrycancelStreamRegistryForRestorenewCloseableRegistry();backendCloseableRegistry.registerCloseable(cancelStreamRegistryForRestore);BackendRestorerProcedureOperatorStateBackend,OperatorStateHandlebackendRestorernewBackendRestorerProcedure((stateHandles)-stateBackend.createOperatorStateBackend(environment,operatorIdentifierText,stateHandles,cancelStreamRegistryForRestore),backendCloseableRegistry,logDescription);try{returnbackendRestorer.createAndRestore(prioritizedOperatorSubtaskStates.getPrioritizedManagedOperatorState());}finally{if(backendCloseableRegistry.unregisterCloseable(cancelStreamRegistryForRestore)){IOUtils.closeQuietly(cancelStreamRegistryForRestore);}}}创建CloseableRegisty确保在任务取消的情况下能够关闭在恢复状态时构造的数据流。创建BackendRestorerProcedure封装了stateBackend.createOperatorStateBackend()方法并包含恢复历史状态数据的操作。创建OperatorStateBackend并恢复状态数据。其中prioritizedOperatorSubtaskStates是从TaskStateManager中根据OperatorID获取的算子专有历史状态可以通过prioritizedOperatorSubtaskStates获取当前算子中的PrioritizedManagedOperatorState并基于这些状态数据恢复OperatorStateBackend中算子的状态。3.基于MemoryStateBackend创建CheckpointStorage在createCheckpointStorage()方法中直接创建MemoryBackendCheckpointStorage实例并返回没有涉及太多的流程publicCheckpointStoragecreateCheckpointStorage(JobIDjobId)throwsIOException{returnnewMemoryBackendCheckpointStorage(jobId,getCheckpointPath(),getSavepointPath(),maxStateSize);}参考《Flink设计与实现核心原理与源码解析》–张利兵

相关推荐

【Flink集群RPC通讯机制(四)】集群组件(tm、jm与rm)之间的RPC通信
【Flink集群RPC通讯机制(四)】集群组件(tm、jm与rm)之间的RPC通信

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:11:54

【数据仓库设计基础(二)】维度数据模型:Kimball数仓建模方法论
【数据仓库设计基础(二)】维度数据模型:Kimball数仓建模方法论

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:10:54

【安装】kafka基础(3):kafka 单机与集群安装
【安装】kafka基础(3):kafka 单机与集群安装

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:10:54

【大数据框架】Calcite 基础概念:从 SQL 到执行计划的思维路径
【大数据框架】Calcite 基础概念:从 SQL 到执行计划的思维路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:51:56

Qwen3-Omni:多模态AI实时交互全攻略
Qwen3-Omni:多模态AI实时交互全攻略

Qwen3-Omni:多模态AI实时交互全攻略 导语 Qwen3-Omni-30B-A3B-Instruct正式发布,作为一款原生支持文本、图像、音视频输入并实时生成语音的多语言全模态模型,它标志着AI交互从单一模态向"感知-理解-响应"全链路智能化的跨越。 行… · 2026/11/3 9:51:56

三环境测试全覆盖:OpenRouter ai-sdk-provider Node、Edge与E2E测试体系解析
三环境测试全覆盖:OpenRouter ai-sdk-provider Node、Edge与E2E测试体系解析

【免费下载链接】ai-sdk-provider The OpenRouter provider for the Vercel AI SDK contains support for hundreds of models through the OpenRouter chat and completion APIs. 项目地址: https://gitcode.com/gh_mirrors/ai/ai-sdk-provider 点击查看 免费下载 … · 2026/11/3 9:51:56

RLPR-Qwen2.5:无验证器也能玩转推理?
RLPR-Qwen2.5:无验证器也能玩转推理?

RLPR-Qwen2.5:无验证器也能玩转推理? 导语:OpenBMB团队推出基于Qwen2.5-7B-Base优化的RLPR-Qwen2.5-7B-Base模型,采用创新的RLPR框架,无需外部验证器即可提升大模型推理能力,为通用领域推理任务提供新范式。… · 2026/11/3 9:51:56

Folia PWA 手机端安装指南:3 步装好歌词动画播放器
Folia PWA 手机端安装指南:3 步装好歌词动画播放器

Folia PWA 手机端安装指南:3 步装好歌词动画播放器 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia 歌词动画播放器可以以 PW… · 2026/11/3 9:51:56

【44】苹果数据集(有v5/v8模型)/YOLO苹果检测
【44】苹果数据集(有v5/v8模型)/YOLO苹果检测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 9:50:51

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码