24.DataStream API之State & Fault Tolerance(State Schema Evolution)

flink 1.9

State Schema Evolution

Apache Flink streaming applications应用程序通常设计为无限期或长时间运行。与所有长时间运行的服务一样,需要更新应用程序以适应不断变化的需求。应用程序所针对的数据schema也是如此;它们随着应用程序的发展而发展。

本章概述了如何演化状态类型的数据schema。当前的限制因不同的类型和状态结构(ValueState、ListState等)而异。

请注意,只有在使用由Flink自己的类型序列化框架(type serialization framework)生成的状态序列化器时,本章所述的信息才是与其相关的。也就是说,在声明状态时,所提供的状态描述符没有配置为使用特定的TypeSerializer或TypeInformation,在这种情况下,Flink推断关于状态类型的信息:

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

checkpointedState = getRuntimeContext().getListState(descriptor);

本质上,状态schema是否可以演化取决于用于读取/写入持久状态字节的序列化器。简单地说,只有注册状态的序列化器正确地支持它,注册状态的schema才能得到演化。这是由Flink s类型序列化框架生成的序列化器透明地处理的(当前支持范围如下所示below)。

如果您打算为您的状态类型实现自定义TypeSerializer,并且希望了解如何实现序列化器来支持状态schema演化,请参阅自定义状态序列化(Custom State Serialization)。那里的文档还包括关于状态序列化器和Flink的状态后端之间相互作用的必要内部细节,以支持状态schema的演化。

 

Evolving state schema

要发展给定状态类型的schema模式,您将采取以下步骤:

  1. 为Flink流作业创建一个savepoint;
  2. 更新应用程序中的状态类型(例如,修改Avro类型schema);
  3. 从savepoint恢复作业。当第一次访问状态时,Flink将评估状态schema是否已经更改,并在必要时迁移状态schema。

迁移状态以适应更改schema模式的过程会自动地、独立地针对每个状态来进行。这个过程由Flink在内部执行,首先检查状态的新序列化器是否具有与前一个序列化器不同的序列化schema模式;如果是这样,则使用前面的序列化器将状态读取到对象,然后使用新的序列化器再次将状态写入字节流中。

关于迁移过程的进一步细节超出了本文档的范围;请参考这里here

 

Supported data types for schema evolution

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

计划扩展对更多复合类型的支持;有关详细信息,请参阅FLINK-10896

 

POJO types

Flink支持基于以下规则集的POJO类型(POJO types)模式的演进:

  1. 可以删除字段。一旦删除,删除字段的前一个值将会在之后的检查点checkpoints和保存点checkpoints中删除。
  2. 可以添加新字段。新字段将初始化为其类型的默认值,如Java所定义的那样(defined by Java)。
  3. 声明的字段类型不能更改。
  4. POJO类型的类名不能更改,包括类的名称空间namespace。

请注意,只有在使用Flink版本高于1.8.0之前的savepoint保存点进行恢复时,才能演变POJO类型状态的schema模式。 使用早于1.8.0的Flink版本进行还原时,无法更改schema模式。

 

Avro types

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

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

注意:不支持键keys的模式schema演化。

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

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

使用Kryo时,框架无法验证是否进行了任何不兼容的更改。

 

Want to contribute translation?

https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/stream/state/schema_evolution.html

https://www.jianshu.com/p/ef9444cfb794

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值