Flink源码之State创建流程
StreamOperatorStateHandler
在StreamTask启动初始化时通过StreamTaskStateInitializerImpl::streamOperatorStateContext会为每个StreamOperator 创建keyedStatedBackend和operatorStateBackend,在AbstractStreamOperator中有个StreamOperatorStateHandler成员变量,调用AbstractStreamOperator::initializeState方法中会初始化StreamOperatorStateHandler类型的成员变量, StreamOperatorStateHandler对象变量封装了keyedStatedBackend和operatorStateBackend,用于统一管理SteamOperator的状态。
OperatorChain::initializeStateAndOpenOperators //调用每个Operator的initializeState和Open方法AbstractStreamOperator::initializeState(StreamTaskStateInitializer) StreamTaskStateInitializerImpl::streamOperatorStateContext //此时会创建keyedStatedBackend和operatorStateBackendStreamOperatorStateHandler::new //初始化StreamOperator的stateHandler成员变量,用于状态管理StreamOperatorStateHandler::initializeOperatorStateStateInitializationContextImpl::new //封装DefaultKeyedStateStore和OperatorStateStoreCheckpointedStreamOperator::initializeState(StateInitializationContext)//调用用户定义函数中的initializeState方法,可获取Operator StateStreamingRuntimeContext::setKeyedStateStore
Flink中主要有两种StateBackend:
- HashMapStateBackend //内存
- EmbeddedRocksDBStateBackend //内存+磁盘
每个StreamTask一个StateBackend成员变量,在构造函数中进行初始化,通过用户代码中设置或StateBackendLoader::loadStateBackendFromConfig从配置中加载,默认为HashMapStateBackend。简单起见,以HashMapStateBackend为例剖析创建KeyedStatedBackend和OperatorStateBackend以及处理数据流时是如何使用KeyedState和OperatorState的。
OperatorState
OperatorState创建流程:
OperatorChain::initializeStateAndOpenOperators //调用每个Operator的initializeState和Open方法AbstractStreamOperator::initializeStateStreamTaskStateInitializerImpl::streamOperatorStateContextStreamTaskStateInitializerImpl::operatorStateBackendHashMapStateBackend::createOperatorStateBackend //创建DefaultOperatorStateBackendStreamOperatorStateHandler::new //创建StreamOperatorStateHandlerStreamOperatorStateHandler::initializeOperatorState //调用CheckpointedFunction::initializeStateStateInitializationContextImpl::new //该实例可getOperatorStateStore
使用Operator State的用户业务代码需要实现CheckpointedFunction接口,该接口中有以两个下方法:
void initializeState(FunctionInitializationContext context) throws Exception;void snapshotState(FunctionSnapshotContext context) throws Exception;
其中initializeState方法则会被StreamOperatorStateHandler.initializeOperatorState 调用,在initializeState方法中可使用
FunctionInitializationContext.getOperatorStateStore().getListState(ListStateDescriptor)
DefaultOperatorStateBackend::getListState::newPartitionableListState::new //内部是ArrayList
因此通过OperatorStateStore获取的ListState内部本质上是一个ArrayList, 业务代码中可以调用add方法向这个内部List添加元素,由StateBackend管理每个Operator State,这样就实现了一个分布式状态管理,借助Checkpoint可以实现状态持久化及容灾恢复。
OperatorStateStore有三个获取状态方法:
<S> ListState<S> getListState(ListStateDescriptor<S> stateDescriptor) throws Exception;
<S> ListState<S> getUnionListState(ListStateDescriptor<S> stateDescriptor) throws Exception;
<K, V> BroadcastState<K, V> getBroadcastState(MapStateDescriptor<K, V> stateDescriptor)throws Exception
KeyedState
KeyedState创建流程如下:
OperatorChain::initializeStateAndOpenOperators //调用每个Operator的initializeState和Open方法AbstractStreamOperator::initializeStateStreamTaskStateInitializerImpl::streamOperatorStateContextStreamTaskStateInitializerImpl::keyedStatedBackendHashMapStateBackend::createKeyedStateBackend //创建HeapKeyedStateBackendHeapKeyedStateBackendBuilder::buildInternalKeyContextImpl::new //用于保存当前正在处理的keyStreamOperatorStateHandler::new //创建StreamOperatorStateHandlerDefaultKeyedStateStore::new //创建DefaultKeyedStateStoreStreamingRuntimeContext::setKeyedStateStore //设置keyedStateStore成员变量AbstractStreamUdfOperator::openFunctionUtils::openFunctionRichFunction::open
KeyedStateStore保存在StreamingRuntimeContext中,使用KeyedState时,用户自定义函数实现RichFunction接口,在open方法中调用getRuntimeContext().getState方法获取状态:
getRuntimeContext().getState() //获取ValueState
DefaultKeyedStateStore::getState
DefaultKeyedStateStore::getPartitionedState
HeapKeyedStateBackend::getPartitionedState
AbstractKeyedStateBackend::getOrCreateKeyedStateLatencyTrackingStateFactory::createStateAndWrapWithLatencyTrackingIfEnabledTtlStateFactory::createStateAndWrapWithTtlIfEnabled //包装TTLHeapKeyedStateBackend::createInternalStateHeapKeyedStateBackend::tryRegisterStateTable //这里很关键,对每个State创建一个StateTableCopyOnWriteStateTable::new//异步快照,这里传递了当前KeyedStateBackend的InternalKeyContextStateTable::new //根据当前Task管理的KeyGroups数量创建StateMap数组CopyOnWriteStateTable::createStateMap //一个KeyGroup一个StateMapCopyOnWriteStateMap::new //存储key及其对应的状态HeapValueState::createHeapValueState::new //有个成员变量指向存储当前state的CopyOnWriteStateMapHeapValueState::setCurrentNamespace //默认为VoidNamespace
KeyedState有以下几种类型
ValueState<T> getState(ValueStateDescriptor<T> stateProperties) 获取HeapValueStateListState<T> getListState(ListStateDescriptor<T> stateProperties)获取HeapListStateMapState<UK, UV> getMapState(MapStateDescriptor<UK, UV> stateProperties)获取HeapMapStategetAggregatingState(AggregatingStateDescriptor<IN, ACC, OUT> stateProperties)获取HeapAggregatingStategetReducingState(ReducingStateDescriptor<T> stateProperties)获取HeapReducingState
RocksDBStateBackend
EmbeddedRocksDBStateBackend 管理OperatorState与HashMapStateBackend 一样,也是通过DefaultOperatorStateBackend进行管理的。
EmbeddedRocksDBStateBackend 管理KeyedState则是使用RocksDBKeyedStateBackend实现,这样可以借助磁盘加内存进行大状态管理:
RocksDBValueState
RocksDBListState
RocksDBMapState
RocksDBAggregatingState
RocksDBReducingState
总结
Flink内置状态管理是相比其他分布式流式处理系统最大的优势之一,不用借助外部存储组件,就可实现高效可靠的分布式状态管理,极大降低了学习和使用成本。
相关文章:
Flink源码之State创建流程
StreamOperatorStateHandler 在StreamTask启动初始化时通过StreamTaskStateInitializerImpl::streamOperatorStateContext会为每个StreamOperator 创建keyedStatedBackend和operatorStateBackend,在AbstractStreamOperator中有个StreamOperatorStateHandler成员变量…...
selenium常见等待机制及其特点和使用方法
目录 1、强制等待 2、隐式等待 3、显示等待 1、强制等待 强制等待是在程序中直接调用Thread.sleep(timeout) ,来完成的,该用法的优点是使用起来方便,语法也比较简单,缺点就是需要强制等待固定的时间,可能会造成测试的时间过…...
C++物件数组的常用方法介绍
以下代码建立了一个物件数组Student,并展示了如何计算物件数组的长度,如何从物件数组中找到特定的对象,如何根据数组的不同参数进行排序,以及如何找到最大和最小值。 #include <iostream> #include <algorithm>using…...
云计算:新一代的技术革命
云计算,作为21世纪的一项重要技术革命,已在全球范围内引发了深远的影响。它改变了我们存储和处理数据的方式,使得企业无需再建设和维护昂贵的本地服务器和数据中心。本文将深入探讨云计算的基本概念,类型,主要优点&…...
数据结构—图的应用
6.4图的应用 概念回顾—生成树 生成树:所有顶点均由边连接在一起,但不存在回路的图。 一个图可以有许多棵不同的生成树、含有n个顶点 n-1 条边的图不一定是生成树所有生成树具有以下共同特点 生成树的顶点个数与图的顶点个数相同;生成树是图的…...
Unity 鼠标控制 UI 放大、缩小、拖拽
文章目录 1. 代码2. 测试场景 1. 代码 using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems;public class UIDragZoom : MonoBehaviour, IDragHandler, IScrollHandler {private Vector2 originalSize;private Vector2 originalPosition;private RectTr…...
tensorflow 模型计算中,预测错误;权重参数加载
tensorflow 模型计算中,预测错误;权重参数加载 tensorflow 模型计算主要代码(正确代码) linear1_kernel_initializer tf.constant_initializer(numpy.transpose(data["linear1.weight"])) linear1_bias_initializer …...
Jay17 2023.8.14日报 即 留校集训阶段性总结
8.14 打了moeCTF,还剩一题ak Web。 Jay17-集训结束阶段性总结: 集训产出: 自集训开始以来一个半月,最主要做的事情有三。 一是跟课程,复习学过的知识,学习新的知识;目前课程已大体听完&…...
【C语言】小游戏-扫雷(清屏+递归展开+标记)
大家好,我是深鱼~ 目录 一、游戏介绍 二、文件分装 三、代码实现步骤 1.制作简易游戏菜单 2. 初始化棋盘(11*11) 3.打印棋盘(9*9) 4.布置雷 5.计算(x,y)周围8个坐标的和 6.排查雷 <1>清屏后打印棋盘 <2>递归展开 <3>标记雷 四、完整代…...
云服务 Ubuntu 20.04 版本 使用 Nginx 部署静态网页
所需操作: 1.安装Nginx 2.修改配置文件 3.测试、重启 Nginx 4.内部修改防火墙 5.配置解析 6.测试是否部署成功 1.安装Nginx // 未使用 root 账号 apt-get update // 更新apt-get install nginx // 安装 nginx 1.1.测试是否安装没问题 在网页上输入云服务的公网…...
无后效性
动态规划的概念 在上例的多阶段决策问题中,各个阶段采取的决策,一般来说是与时间有关的,决策依赖于当前状态,又随即引起状态的转移,一个决策序列就是在变化的状态中产生出来的,故有“动态”的含义…...
Kubernetes系列-删除deployment和pod
通过deployment创建的pod直接执行delete是不会正常被删除的,因为deployment中设置了pod的数量,deployment会动态维护pod的数量,倘若pod数量少于约定数量,deployment会创建pod,直到pod数量达到约定数量才会停止。 如若…...
kotlin字符串方法
以下是一些常用的 String 方法示例: 1.获取字符串长度: val str "Hello, Kotlin" val length str.length2.字符串比较: val str1 "apple" val str2 "banana" val compareResult str1.compareTo(str2)3…...
ubuntu篇---配置FTP服务,本机和docker安装
ubuntu篇---配置FTP服务 一、本机安装1.1 安装FTP服务器软件1.2 配置FTP服务 二、docker安装(我用的这个)2.1 创建 目录2.2 启动脚本2.3 访问2.4 如何创建一个新的用户2.5 测试2.6 使用 一、本机安装 1.1 安装FTP服务器软件 ubuntu安装vsftp sudo apt…...
SpringBoot中properties、yml、yaml的优先级
原理 配置优先级低的会先加载然后会被配置优先级高的覆盖 验证 创建SpringBoot项目(网址) 在resource目录下创建application.properties、application.yml、application.yaml文件 运行 结论 优先级顺序: properties>yml>yaml...
SHELL 基础 SHELL注释 及 执行SHELL脚本的四种方法
SHELL 脚本编写规范 : 脚本开头 : # 脚本第一行 : #! /bin/bash 或 #!/bin/sh ( 脚本解释器 ) # 程序段开头需要加 版本版权信息 ,例如 : # Date 创建日期 # Author : 作者 # …...
【Spring】深入探索 Spring AOP:概念、使用与实现原理解析
文章目录 前言一、初识 Spring AOP1.1 什么是 AOP1.2 什么是 Spring AOP 二、AOP 的核心概念2.1 切面(Aspect)2.2 切点(Pointcut)2.3 通知(Advice)2.4 连接点(Join Point) 三、Sprin…...
LocalDate介绍和使用
1.什么是 LocalDate? 在我们开始之前,让我先简单介绍一下 LocalDate。它是 Java 8 中引入的日期类,用于表示不带时区信息的日期。也就是说,它专注于日期,并忽略了具体的时间。这样,我们就可以专心解决那些…...
三、使用注解形式开发 Spring MVC程序
文章目录 一、环境准备二、配置 web.xml三、配置 SpringMVC-Servlet.xml ,这里不再使用之前那种写法,直接采用注解配置,引入注解支持,配置视图解析器四、编写 Controller(Controller 和 RequestMapping 注解说明&#…...
【Go】常见的四个内存泄漏问题
Goroutine没有顺利结束 1、这里更多的是由于channelforselect导致的,错误的写法导致了发送者或接收者没有发现channel已经关闭,任务已经结束了,却仍然在尝试输入输出https://geektutu.com/post/hpg-exit-goroutine.html Map的remove方法不会…...
Unity纹理保真优化:ASTC压缩与Mipmap精准控制方案
1. 这不是“去马赛克”,而是精准还原被压缩破坏的视觉信息Unity游戏开发中,你有没有遇到过这样的场景:美术同事发来一张4K高清角色贴图,你兴冲冲拖进Unity,设置成Texture Type Default、Compression ASTC_6x6&#x…...
就业指导|中九非科班毕业,华为 OD 做 Java 后端想转 C++,能找到深度学习挂钩的岗工作吗?
这类题最容易让人一下把难度叠得太高。 因为你实际上不是只在做一次转向。 你想做的是三件事同时发生: 从 Java 后端转 C 还想和深度学习挂钩 最好岗位还能成立 问题就在这里。 这三个目标不是完全冲突。 但如果你把它理解成: “我直接转去做纯 …...
Dism++:Windows系统维护的终极免费工具,一键解决卡顿和更新问题
Dism:Windows系统维护的终极免费工具,一键解决卡顿和更新问题 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 你是否曾为Windows系统运行…...
Windows热键侦探:一键揪出占用你快捷键的“元凶“
Windows热键侦探:一键揪出占用你快捷键的"元凶" 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是…...
Claude CLI 缓存陷阱:为什么用第三方模型时 token 会暴涨 10 倍?
一个开发者的真实经历 上周,我收到一位朋友的微信: “我用 Claude Code 接 DeepSeek API,明明代码没怎么变,token 消耗却突然涨了好几倍,一天就把额度用完了。” 这个情况不是个例。在 GitHub 上,至少有 80 多个相关 issue,核心问题都指向同一个点——Claude CLI 默认…...
告别Excel人工统计!学生考勤自动分析系统搭建实录
实验背景 本实验基于“数智教育”大赛数据集,设计并实现学生多维度考勤统计转换流,目标是掌握ETL数据处理全过程,包括数据接入、数据清洗、多表关联、字段衍生、指标聚合以及结果落地等核心技能,完成学生考勤主题标签构建任务&am…...
Agent 框架别急着乱学:先用 LangChain 搞懂 7 个基本模块
先说结论。 如果你想系统理解 Python Agent 框架,LangChain 仍然值得作为第一篇。它不是最轻的,也不是最“自动化”的,但它把 Agent 应用里的关键零件都摆出来了:模型、工具、状态、记忆、middleware、多 Agent 路由和 tracing。…...
从账单明细看Taotoken计费模式的透明与可追溯性
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从账单明细看Taotoken计费模式的透明与可追溯性 对于将大模型API集成到产品中的团队而言,成本控制与核算是一个核心的工…...
DLSS版本管理器:5分钟掌握游戏性能优化终极指南
DLSS版本管理器:5分钟掌握游戏性能优化终极指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏帧数不稳定而烦恼?是否想体验最新DLSS技术带来的性能提升却不知从何入手ÿ…...
3个关键问题揭示:为什么你需要DLSS版本管理器提升游戏体验
3个关键问题揭示:为什么你需要DLSS版本管理器提升游戏体验 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾因游戏卡顿而烦恼?是否想知道为什么别人的游戏画面更流畅?DLSS Sw…...
