26、Flink 的状态数据结构升级

状态数据结构升级
a)概述

Flink 流应用通常被设计为永远或者长时间运行,与所有长期运行的服务一样,应用程序需要随着业务的迭代而进行调整,应用所处理的数据 schema 也会随着进行变化。

升级状态类型的数据 schema ,对不同类型的状态结构(ValueStateListState 等)有不同的限制;只适用于 Flink 自己生成的状态序列化器;即在声明状态时,状态描述符不可以配置为使用特定的 TypeSerializer 或 TypeInformation , 此时 Flink 会推断状态类型的信息:

在这里插入图片描述

ListStateDescriptor<MyPojoType> descriptor =new ListStateDescriptor<>("state-name",MyPojoType.class);checkpointedState = getRuntimeContext().getListState(descriptor);

在内部,状态是否可以进行升级取决于用于读写持久化状态字节的序列化器,状态数据结构只有在其序列化器正确支持时才能升级;这一过程是被 Flink 的类型序列化框架生成的序列化器透明处理的。

b)升级状态数据结构

对状态类型升级,步骤如下

  • 对 Flink 流作业进行 savepoint 操作。
  • 升级程序中的状态类型(例如:修改 Avro 的结构)。
  • 从 savepoint 恢复作业。当第一次访问状态数据时,Flink 会判断状态数据 schema 是否已经改变,并进行必要的迁移。

适应状态结构的改变而进行的状态迁移过程是自动发生的,并且状态之间是互相独立的。

Flink 内部首先会检查新的序列化器相对比之前的序列化器是否有不同的状态结构;如果有, 那么之前的序列化器用来读取状态数据字节到对象,然后使用新的序列化器将对象回写为字节。

c)数据结构升级支持的数据类型

目前,仅支持 POJO 和 Avro 类型的 schema 升级。

POJO 类型

Flink 基于下面的规则来支持 POJO 类型结构的升级

  • 可以删除字段。一旦删除,被删除字段的前值将会在将来的 checkpoints 以及 savepoints 中删除。
  • 可以添加字段。新字段会使用类型对应的默认值进行初始化。
  • 不可以修改字段的声明类型。
  • 不可以改变 POJO 类型的类名,包括类的命名空间。

注意:只有从 1.8.0 及以上版本的 Flink 生产的 savepoint 进行恢复时,POJO 类型的状态才可以进行升级;对 1.8.0 版本之前的 Flink 是没有办法进行 POJO 类型升级的。

Avro 类型

Flink 支持 Avro 状态类型的升级,只要数据结构的修改是被 Avro 的数据结构解析规则认为兼容的即可。

除非新的 Avro 数据 schema 生成的类无法被重定位或者使用了不同的命名空间,在作业恢复时状态数据会被认为是不兼容的。

d)Schema 迁移限制

Flink 的 Schema 迁移有一些限制,这些限制是确保正确性所必需的;对于需要绕过这些限制并理解它们在特定用例中是安全的用户,可以考虑使用自定义序列化程序或状态处理器 API。

不支持 key 的 schema 演变

无法迁移 key 的 schema,因为这可能导致不确定性行为;例如,如果一个POJO 被用作 key,并且一个字段被丢弃,那么可能会突然出现多个现在相同的单独键,Flink无法合并相应的值。

此外,RocksDB 状态后端依赖于二进制对象标识,而不是 hashCode 方法,对 key 的对象结构的任何更改都可能导致不确定性行为。

Kryo 不能用于 schema 演变

当使用 Kryo 时,框架不能验证是否进行了不兼容的更改;如果包含给定类型的数据结构通过 Kryo 进行序列化,那么所包含的类型就不能进行 schema 进化。

例如,如果一个 POJO 包含一个 List<SometherPojo>,那么该 List 及其内容是通过 Kryo 序列化的,SometherPojo 不支持模式演化。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初始Java篇(JavaSE基础语法)(8)认识String类(上)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaSE 简单介绍&#xff1a;在C语言中已经涉及到字符串了&#xff0c;但是在C语言中要表示字符串只能使用字符数组或者字符指针&#xff0c;可…

leetcode算法笔记-算法复杂度

对于时间复杂度&#xff0c;主要包括三种情况&#xff1a; 渐进紧确界&#xff1a; O渐进上界&#xff1a; 渐进下界&#xff1a; 加法原则&#xff1a;不同的时间复杂度相加取阶数最高的 乘法原则&#xff1a;不同的时间复杂度相乘&#xff0c;结果为时间复杂度的乘积 阶乘…

电脑nvidia驱动和合适版本的duda--自用 回忆版

参考文献&#xff1a;http://t.csdnimg.cn/ecDuG 内容很多抄的这个&#xff0c;主要害怕链接失效 一、Ubuntu 18.04 安装NVIDIA显卡驱动 1、查看本机显卡能够配置的驱动信息 ubuntu-drivers devices所以可以看出&#xff0c;推荐 nvidia-driver-530 - distro non-free 2、安…

Kubernetes学习-深入Pod篇(一) 创建Pod,Pod配置文件详解

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Kubernetes渐进式学习-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 1.前言 我们在前面的文章讲解了Kubernetes的核心概念和服务部署&#x…

MyBatis-plus(一):快速入门

目录 一、MyBatis-plus 快速入门 1、原理 2、实体类命名规则 3、常见注解 4、主键 id 策略 5、使用 TableField 的常见场景 6、常用配置 二、核心功能 1、条件构造器 2、自定义 SQL 3、IService 接口 一、MyBatis-plus 快速入门 1、原理 MyBatisPlus 通过扫描实体…

算法学习012-不同路径 c++动态规划算法实现 中小学算法思维学习 信奥算法解析

目录 C不同路径 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C不同路径 一、题目要求 1、编程实现 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09…

Golang | Leetcode Golang题解之第78题子集

题目&#xff1a; 题解&#xff1a; func subsets(nums []int) (ans [][]int) {set : []int{}var dfs func(int)dfs func(cur int) {if cur len(nums) {ans append(ans, append([]int(nil), set...))return}set append(set, nums[cur])dfs(cur 1)set set[:len(set)-1]df…

计算概论学习笔记(2)

感谢北大李戈老师讲解的计算概论。 【道阻且长&#xff0c;行则将至】 很多年没有intensive coding&#xff0c;现在这个系列是coding retake&#xff0c;一点点回忆之前的知识&#xff0c;希望能重回到一线。主要内容包括C,C,Pytorch学术前沿项目学习和实践&#xff0c;预计…

iOS 安装cocoapds

注意 CocoaPods安装是基于ruby环境的&#xff0c;所以要安装CocoaPods先要安装Ruby环境&#xff0c;国内不能直接安装&#xff0c;只能通过VPN或淘宝的Ruby镜像来访问。 安装过程 gem sources --remove https://rubygems.org/ ** (注意是两个“-”&#xff0c;否则会移除失败) …

掌握文件重命名技巧:一次性处理多路径文件并赋予独立编号

在日常工作和生活中&#xff0c;我们经常需要处理大量的文件&#xff0c;而文件重命名则是一项非常常见的任务。如何高效地一次性处理多路径文件并赋予独立编号&#xff0c;成为许多用户关注的焦点。本文将介绍云炫文件管理器一些实用的文件重命名技巧&#xff0c;帮助您轻松应…

前后端完全开源!功能丰富的在线教室项目:Agora Flat

Agora Flat&#xff1a;高效集成的在线教室解决方案&#xff0c;重塑互动学习新体验。- 精选真开源&#xff0c;释放新价值。 概览 Agora Flat是在GitHub平台上公开分享的一个全面开源项目&#xff0c;它精心设计为一个高性能的在线教室解决方案&#xff0c;旨在便捷地搭建支持…

锐捷EWEB网管系统RCE漏洞

文章目录 免责声明漏洞描述漏洞原理影响版本漏洞复现修复建议 免责声明 该文章只为学习和交流&#xff0c;请不要做违法乱纪的事情&#xff0c;如有与本人无关 漏洞描述 锐捷网管系统是由北京锐捷数据时代科技有限公司开发的新一代基于云的网络管理软件&#xff0c;以"…

哈希表(unordered_set、unordered_map)

文章目录 一、unordered_set、unordered_map的介绍二、哈希表的建立方法2.1闭散列2.2开散列&#xff08;哈希桶/拉链法&#xff09; 三、闭散列代码&#xff08;除留余数法&#xff09;四、开散列代码&#xff08;拉链法/哈希桶&#xff09; 一、unordered_set、unordered_map的…

数据结构之——队列详解

目录 前言&#xff1a; 一、什么是队列 二、队列的实现 2.1 队列结构 2.2 队列初始化 2.3 队列销毁 2.4 入队列 2.5 出队列 2.6 获取队列头部元素 2.7 获取队列尾部元素 2.8 获取队列中有效元素个数 2.9 检测队列是否为空 三、 代码总览 Queue.h test.c 四、例题 前言…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3&#xff0c;又不想额外去安装python3时&#xff0c;可能会遇到版本过低&#xff0c;无法安装库的情况&#xff0c;以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中&#xff0c;python3为3.7.3&#xff0c;需要安装numpy&am…

Python专题:八、列表(1)

Python的内置数据类型 数据类型&#xff1a;列表 list类型 可以是字符串&#xff0c;浮点数&#xff0c;整数&#xff0c;列表 列表特性 ①集合性的数据类型 ②列表是有序的 ③列表是可更新的 访问列表元素的方式也是[索引]&#xff0c;也是从0开始的&#xff0c;不能超过…

EasyNmon服务器性能监控工具环境搭建

一、安装jdk环境 1、看我这篇博客 https://blog.csdn.net/weixin_54542209/article/details/138704468 二、下载最新easyNmon包 1、下载地址 https://github.com/mzky/easyNmon/releases wget https://github.com/mzky/easyNmon/releases/download/v1.9/easyNmon_AMD64.tar.…

Ansible-inventory和playbook

文章目录 一、inventory 主机清单1、列表表示2、inventory 中的变量3、变量3.1 主机变量3.2 组变量3.3 组嵌套 二、playbook剧本1、playbook的组成2、编写剧本2.1 剧本制作2.2 准备nginx.conf2.3 运行剧本2.4 查看webservers服务器2.5 补充参数 3、剧本定义、引用变量3.1 剧本制…

kdb 调试内核-延迟驱动加载

说明: 系统在启动过程中&#xff0c;一些要调试的驱动在 "进入kdb 之前" 就已经加载了&#xff0c; 那么&#xff0c;我们就需要延迟 "加载驱动" #define XX_module_platform_driver(__platform_driver) \XX_module_driver(__platform_driver, platform_d…

【Java】高效解决 非降序数组合并 两种方法

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; oj&#xff1a;https://leetcode.cn/problems/merge-sorted-array/submissions/ 合并两个有序数组是个经典问题&#xff0c;它不仅在算法学习中频繁出现&#xff0c;也在实际开发中经常遇到。合并数…