概述
Flink全托管提供状态兼容性检查和状态数据迁移功能。本文为您介绍Flink全托管兼容性判断的结果详情,以及RocksDB和Gemini两种StateBackend在状态数据迁移时的迁移效率和作业表现方面的区别。
背景信息
Flink作业是通过状态数据(包括Checkpoint和Savepoint)保存作业中间的计算结果。当前Flink SQL已经可以帮助您支持各种流计算场景。为了满足开发迭代需求或业务发展需求,SQL作业也需要不断变更,否则修改SQL作业后,并使用原来的状态数据重启作业,会出现状态不兼容的问题。
从vvr-4.0.11-flink-1.13版本开始,Flink全托管提供状态兼容性检查和状态数据迁移功能,可以最大可能的复用原来的状态数据,帮助您快速升级SQL作业。作业修改上线后,如果您选择基于状态启动作业时,则系统会根据您选择的状态数据,给出兼容性判断,结果详情请参见兼容性。
为了让您选择的状态数据能适配新作业,则需要对状态数据进行迁移。Flink全托管支持RocksDB和Gemini两种StateBackend,二者在迁移效率和作业表现方面有一定的区别,详情请参见状态迁移。
兼容性
系统会根据您选择的状态数据,给出兼容性判断,结果有以下几种:
完全兼容
当前作业和状态数据完全兼容。即基于状态数据运行的结果和完全基于历史数据运行的结果一致。为了达到完全兼容,可能需要进行状态数据迁移,详情请参见状态迁移。
部分兼容
当前作业和状态数据部分兼容。即兼容的部分列基于状态数据运行的结果和完全基于历史数据运行的结果一致,其余列在状态中没有对应的数据,和完全基于历史数据运行的结果不一致。为了达到部分兼容,可能需要进行状态数据迁移,详情请参见状态迁移。
不兼容
当前作业和状态数据不兼容。
警告。如果基于该状态数据启动,大概率会出现启动失败或者运行结果不符合预期的问题,请谨慎选择。
当前状态是否兼容需要重启后判断
警告如果基于该状态数据启动,可能会出现启动失败或者运行结果不符合预期的问题,请谨慎选择。
状态迁移
RocksDB和Gemini的迁移效率和作业表现方面的区别详情如下:
RocksDB
RocksDB是在作业启动时,会对所有的状态数据进行一次全量的迁移。此时整个作业已经启动,处于RUNNING状态,而需要发生数据迁移的算子处于INITIALIZING状态,并且不会消费和处理任何数据。等该算子所有数据都迁移完成,算子的状态会变为RUNNING状态,表示所有状态迁移完成,开始正常消费数据。
说明因为修改了Aggregate Function,所以在作业启动时,RocksDB会进行全量状态迁移。上图中的GroupAggregate算子处于INITIALIZING状态,此时该算子不能处理数据。
Gemini
与RocksDB在作业启动时进行状态全量迁移的行为不同,Gemini是在作业运行时按需迁移,即只有访问到状态中某条数据时,这条数据才会发生迁移。整个作业启动后,作业处于RUNNING状态,需要发生状态迁移的算子会很快从INITIALIZING状态变为RUNNING状态,并开始正常消费数据。随着状态迁移的进行,TPS会逐渐恢复到正常值,表示所有状态迁移完成。相比RocksDB,Gemini的整体迁移时间更短。
说明在Gemini和RocksDB对应完全相同的SQL和状态数据时,Gemini很快从INITIAIZING状态(加载状态数据)变为RUNNING状态,并开始处理数据。