状态方案的演变

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. MySQL 中的WAL机制

    本文主要概括的是 WAL 机制涉及的三种日志,具体与其他组件的联系.执行可查看 一条 sql 的执行过程详解 .MySQL中的事务原理和锁机制 . 是什么 WAL,全称是Write-Ahead Log ...

  2. Java 8 之前的时间处理

    最近在自己瞎折腾,有一个需求是计算当前日期到指定日期有多少天,用于实现纪念日或倒计时的功能.查阅资料后发现Java 8之前的时间日期处理很是麻烦而且被频频吐槽,以至于后来在 Java 8 中推出了一个 ...

  3. Python解释器和IPython

    目录 简介 Python解释器 IPython 魔法函数 运行和编辑 Debug History 运行系统命令 简介 今天给大家介绍一下Python的一个功能非常强大的解释器IPython.虽然Pyt ...

  4. laravel5.4 接入qq第三方登录

    第一步:先composer安装需要用到的依赖,命令行如下 composer require socialiteproviders/qq 第二步:在config/app.php 中的 providers ...

  5. Laya 踩坑日记-人物模型穿模,模型显示不正常

    最近做游戏,人物要跑到很远的位置,z轴距离大概有20000个单位,然后就发现一个bug,到远处人物模型穿了,而且没办法改,这就尴尬了 Z轴对应值    0    100000 100000 当距离零点 ...

  6. 深入理解nodejs中的异步编程

    目录 简介 同步异步和阻塞非阻塞 javascript中的回调 回调函数的错误处理 回调地狱 ES6中的Promise 什么是Promise Promise的特点 Promise的优点 Promise ...

  7. 微信小程序request请求的封装

    目录 1,前言 2,实现思路 3,实现过程 3.1,request的封装 3.2,api的封装 4,实际使用 1,前言 在开发微信小程序的过程中,避免不了和服务端请求数据,微信小程序给我们提供了wx. ...

  8. 【Oracle】静默安装oracle 11.2.0.4 超详细

    安装oracle 1.执行脚本完成初始化oracle环境 2.解压缩oracle的压缩包,单实例1个,rac是2两个压缩包 3.修改response下的db_install.rsp 修改内容如下: - ...

  9. 08--Docker安装Mysql

    1.在hub.docker.com中查找5.7版本 2.拉取mysql docker pull mysql:5.7 3.启动mysql镜像 docker run -p 3306:3306 --name ...

  10. POJ1629:picnic planning

    题目描述 矮人虽小却喜欢乘坐巨大的轿车,轿车大到可以装下无论多少矮人.某天,N(N≤20)个矮人打算到野外聚餐.为了 集中到聚餐地点,矮人A 有以下两种选择 1)开车到矮人B家中,留下自己的轿车在矮人 ...