状态方案的演变

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. 一文讲尽门面日志slf4j和log4j、log4j2、logback依赖jar引用关系

    公众号Mac代码分割阅读链接 前言 之前都是使用SparkStreaming开发,最近打算学习一下Flink,就从官网下载了Flink 1.11,打算搞一个客户端,将程序提交在yarn上.因为Flin ...

  2. Beta冲刺--总结随笔

    一.项目预期计划 时间 (天) 预期计划 完成情况 1-2 登录注册页面美化 完成 3-5 完善寻/失物登记以及管理页面 完成 6-9 实现剩下的用户管理.我的账号等页面 50% 9-10 最终测试与 ...

  3. loj #6179. Pyh 的求和 莫比乌斯反演

    题目描述 传送门 求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^m \varphi(ij)(mod\ 998244353)\) \(T\) 组询问 \(1 \leq ...

  4. 【函数分享】每日PHP函数分享(2021-1-8)

    explode() 使用一个字符串分割另一个字符串. array explode( string $delimiter , string $string [, int $limit ]) 参数描述de ...

  5. springboot源码解析-管中窥豹系列之排序(五)

    一.前言 Springboot源码解析是一件大工程,逐行逐句的去研究代码,会很枯燥,也不容易坚持下去. 我们不追求大而全,而是试着每次去研究一个小知识点,最终聚沙成塔,这就是我们的springboot ...

  6. 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  7. LeetCode144 二叉树的前序遍历

    给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? /** * Defin ...

  8. 【TNS】listener.ora模板;tnsnames.ora模板

    好多人使用监听的时候误操作,将监听弄的不好使了,这次这个模板,不光是针对大家出现的这种问题,也是给我自己留一个记录,方便他人,方便自己. listener.ora模板样例 -------------- ...

  9. 优化太多的if-else

    来源java小当家 第1种方法:提前return,减少else判断 1 // 1.优化前 2 private int handlerPre1(boolean flag) { 3 if(flag){ 4 ...

  10. 面试官问我CAS,我一点都不慌

    文章以纯面试的角度去讲解,所以有很多的细节是未铺垫的. 文章中写到的处理线程安全的思路每一项技术都可以写出一篇文章,AQS.Synchronized.Atomic...周末肝起来!下周再来给大家安排! ...