

# State Schema Evolution 状态架构演进

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

本页概述了如何发展状态类型的数据架构。当前的限制因不同类型和状态结构(`ValueState`, `ListState`,等)而异。

请注意，只有在使用由flink的[类型序列化框架](//ci.apache.org/projects/flink/flink-docs-release-1.7/dev/types_serialization.html)生成的状态序列化程序时，此页上的信息才是相关的。也就是说，当声明您的状态时，所提供的状态描述符未配置为使用特定的 `TypeSerializer` 或`TypeInformation`，在此情况下，flink推断有关该状态类型的信息：



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

checkpointedState = getRuntimeContext().getListState(descriptor);
```



在引擎罩下，是否可以演变状态模式取决于用于读/写持久状态字节的串行器。简单地说，只有在序列化程序正确支持它的情况下才能演变注册状态“S”模式。这是由flink的类型序列化框架（当前支持范围[下面]（//ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/state/schema_evolution.html#supported-data-types-for-schema-evolution））生成的序列化程序透明处理的。

如果您打算为您的状态类型实现自定义的`TypeSerializer`，并且希望了解如何实现序列化程序以支持状态模式演化，请参阅[自定义状态Serialization](//ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/state/custom_serialization.html).那里的文档还涵盖了关于状态序列化器和Flink的状态后端之间的相互作用的必要的内部细节，以支持状态模式的演化。

## Evolving state schema 演化状态模式

要发展给定状态类型的架构，您需要执行以下步骤：

1.  获取FLink流作业的保存点。
2.  更新应用程序中的状态类型(例如，修改Avro类型模式)。
3.  从保存点恢复作业。首次访问状态时，flink将评估该模式是否已针对该状态进行了更改，并在必要时迁移状态模式。

迁移状态以适应改变的模式的过程自动发生，并且对于每个状态是独立的。通过首先检查该状态的新串行化器是否具有不同于先前串行器的串行化模式来在内部执行该过程；如果是，则使用先前的串行器将该状态读取到对象，并再次用新的串行器将其写回字节。

有关迁移过程的更多详细信息超出了本文档的范围；请参阅[here](//ci.apache.org/projects/flink/flink-docs-release-1.7/dev/stream/state/custom_serialization.html).。

## Supported data types for schema evolution 支持模式演化的数据类型

目前，架构演进仅支持AVRO。因此，如果您关注状态的架构演进，当前建议始终使用AVRO来进行状态数据类型。

有计划将支持扩展到更多的复合类型，例如POJO；有关详细信息，请参阅[FLINK-10897]（https://issues.apache.org/jira/browse/FLINK-10897）。

### Avro types Avro类型

Flink完全支持不断发展的Avro类型状态模式，只要模式更改被[Avro的模式resolution](http://avro.apache.org/docs/current/spec.html#Schema解析规则]认为是兼容的。

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

