状态方案的演变

Apache Flink流媒体应用通常被设计为无限期或长时间运行。与所有长期运行的服务一样,应用程序需要更新以适应不断变化的需求。这对于应用程序所针对的数据模式也是一样的,它们会随着应用程序的发展而发展。

本页提供了关于如何演进状态类型的数据模式的概述。当前的限制在不同的类型和状态结构(ValueState、ListState等)中有所不同。

请注意,本页面上的信息仅在您使用由Flink自己的类型序列化框架生成的状态序列化器时相关。也就是说,在声明你的状态时,所提供的状态描述符并没有被配置为使用特定的TypeSerializer或TypeInformation,在这种情况下,Flink会推导出状态类型的信息。

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

  

在外壳下,状态的模式是否可以被演化取决于用于读取/写入持久化状态字节的序列器。简单地说,只有当它的序列化器正确地支持时,一个注册状态的模式才能被演化。这是由Flink的类型序列化框架生成的序列化器透明地处理的(当前的支持范围列在下面)。

如果你打算为你的状态类型实现一个自定义的TypeSerializer,并想了解如何实现序列化器以支持状态模式演化,请参考自定义状态序列化。那里的文档还涵盖了关于状态序列化器和Flink的状态后端之间的相互作用以支持状态模式演化的必要内部细节。

不断发展的状态模式

要演化给定状态类型的模式,您需要采取以下步骤。

  1. 保存你的Flink流作业的保存点。
  2. 更新您的应用程序中的状态类型(例如,修改您的Avro类型模式)。
  3. 从保存点恢复作业。当第一次访问状态时,Flink将评估是否已经改变了状态的模式,并在必要时迁移状态模式。

迁移状态以适应已更改的模式的过程是自动发生的,并且对每个状态都是独立的。这个过程由Flink内部执行,首先检查状态的新序列器是否与之前的序列器有不同的序列化模式,如果有,则用之前的序列器将状态读到对象,再用新的序列器写回字节。

关于迁移过程的更多细节不在本文档范围内,请参考这里

支持的模式演变数据类型

目前,模式演化只支持POJO和Avro类型。因此,如果你关心状态的模式演化,目前建议始终使用Pojo或Avro作为状态数据类型。

有计划扩展对更多复合类型的支持;更多细节请参考FLINK-10896

POJO types

Flink支持POJO类型的进化模式,基于以下一组规则。

  1. 字段可以被删除。一旦被删除,在未来的检查点和保存点中,被删除字段的前值将被丢弃。
  2. 可以添加新字段。新字段将被初始化为其类型的默认值,正如Java所定义的那样。
  3. 已声明的字段类型不能改变。
  4. POJO类型的类名不能改变,包括类的命名空间。

请注意,POJO类型状态的模式只能在Flink版本高于1.8.0的情况下,从以前的保存点恢复时才能进化。当使用比1.8.0更老的Flink版本进行还原时,模式不能被改变。

Avro types

Flink完全支持Avro类型状态的演变模式,只要模式变化被Avro的模式解析规则认为是兼容的。

一个限制是作为状态类型使用的Avro生成的类在恢复作业时不能被重新定位或具有不同的命名空间。

注意 不支持键的模式演变。

举个例子。RocksDB状态后端依赖于二进制对象的标识,而不是hashCode方法实现。对keys对象结构的任何改变都可能导致非确定性行为。

注意Kryo不能用于模式演化。

当使用Kryo时,框架没有可能验证是否有任何不兼容的变化。

Flink-v1.12官方网站翻译-P027-State Schema Evolution的更多相关文章

  1. Flink-v1.12官方网站翻译-P025-Queryable State Beta

    可查询的状态 注意:可查询状态的客户端API目前处于不断发展的状态,对所提供接口的稳定性不做保证.在即将到来的Flink版本中,客户端的API很可能会有突破性的变化. 简而言之,该功能将Flink的托 ...

  2. Flink-v1.12官方网站翻译-P021-State & Fault Tolerance-overview

    状态和容错 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 下一步去哪里? Working wit ...

  3. Flink-v1.12官方网站翻译-P023-The Broadcast State Pattern

    广播状态模式 在本节中,您将了解如何在实践中使用广播状态.请参考状态流处理,了解状态流处理背后的概念. 提供的API 为了展示所提供的API,我们将在介绍它们的全部功能之前先举一个例子.作为我们的运行 ...

  4. Flink-v1.12官方网站翻译-P022-Working with State

    有状态程序 在本节中,您将了解Flink为编写有状态程序提供的API.请看一下Stateful Stream Processing来了解有状态流处理背后的概念. 带键值的数据流 如果要使用键控状态,首 ...

  5. Flink-v1.12官方网站翻译-P010-Fault Tolerance via State Snapshots

    通过状态快照进行容错 状态后台 Flink管理的键控状态是一种碎片化的.键/值存储,每项键控状态的工作副本都被保存在负责该键的任务管理员的本地某处.操作员的状态也被保存在需要它的机器的本地.Flink ...

  6. Flink-v1.12官方网站翻译-P028-Custom Serialization for Managed State

    管理状态的自定义序列化 本页面的目标是为需要使用自定义状态序列化的用户提供指导,涵盖了如何提供自定义状态序列化器,以及实现允许状态模式演化的序列化器的指南和最佳实践. 如果你只是简单地使用Flink自 ...

  7. Flink-v1.12官方网站翻译-P005-Learn Flink: Hands-on Training

    学习Flink:实践培训 本次培训的目标和范围 本培训介绍了Apache Flink,包括足够的内容让你开始编写可扩展的流式ETL,分析和事件驱动的应用程序,同时省略了很多(最终重要的)细节.本书的重 ...

  8. Flink-v1.12官方网站翻译-P002-Fraud Detection with the DataStream API

    使用DataStream API进行欺诈检测 Apache Flink提供了一个DataStream API,用于构建强大的.有状态的流式应用.它提供了对状态和时间的精细控制,这使得高级事件驱动系统的 ...

  9. Flink-v1.12官方网站翻译-P015-Glossary

    术语表 Flink Application Cluster Flink应用集群是一个专用的Flink集群,它只执行一个Flink应用的Flink作业.Flink集群的寿命与Flink应用的寿命绑定. ...

  10. Flink-v1.12官方网站翻译-P004-Flink Operations Playground

    Flink操作训练场 在各种环境中部署和操作Apache Flink的方法有很多.无论这种多样性如何,Flink集群的基本构件保持不变,类似的操作原则也适用. 在这个操场上,你将学习如何管理和运行Fl ...

随机推荐

  1. Linux 下 swap 分区及作用详解

    我们在安装系统的时候已经建立了 swap 分区.swap 分区是 Linux 系统的交换分区,当内存不够用的时候,我们使用 swap 分区存放内存中暂时不用的数据.也就是说,当内存不够用时,我们使用 ...

  2. 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击

    风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...

  3. 《Spring Boot 实战纪实》之前言

    目录 前言 (思维篇)人人都是产品经理 1.需求文档 1.1 需求管理 1.2 如何攥写需求文档 1.3 需求关键点文档 2 原型设计 2.1 缺失的逻辑 2.2 让想法跃然纸上 3 开发设计文档 3 ...

  4. Faceto_object_programdesign

    一面向对象程序设计思想 1 和面向过程关注点不同 过程: 程序执行流程和逻辑 (局部功能) 对象: 程序中的对象 (程序结构) 2 对象 现实世界中的实体和事物 可以看成是一种具有自身属性和功能的构件 ...

  5. 使用Pr压缩视频,增大音量

    视屏压缩(亲测有效教程):https://www.zhihu.com/question/67762625 音量增大(亲测有效教程):https://jingyan.baidu.com/article/ ...

  6. JAVA原生mvc实现用户信息的增删查改

    笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...

  7. Linux基础命令整合

    linux基础命令整理 1.系统相关命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minu ...

  8. Azure Key Valut 简介

    Azure Key Vault(密钥库)是用于安全地存储和访问Secret的云服务,Secret是需要严格控制访问权限的内容,例如API密钥,密码,证书或加密密钥.Key Vault Service支 ...

  9. mysql中的kill

    show processlist;查看id, 然后 kill id ; 就行了.

  10. mysql 设置外键约束时如何删除数据

    Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构 解决方法是在Mysql中取消外键约束: SET FOREIGN_KEY_CHECKS=0; 然后将原来表的数据导出到sql语句,重新 ...