State Processor API:如何读取,写入和修改 Flink 应用程序的状态

  • 时间:
  • 浏览:0

过去无论您是在生产中使用,还是调研Apache Flink,估计您突然会问从前有有兩个 难题报告 :我该怎么访问和更新Flink保存点(savepoint)中保存的state?我不要 再询问了,Apache Flink 1.9.0引入了情况表补救器(State Processor)API,它是基于DataSet API的强大扩展,允许读取,写入和修改Flink的保存点和检查点(checkpoint)中的情况表。

然而,Flink用户突然会提出也能“从内部内部结构”访问应用守护tcp连接的情况表的需求。你这人需求的动机将会是验证或调试应用守护tcp连接的情况表,将会将应用守护tcp连接的情况表迁移到从前应用守护tcp连接,将会从内部内部结构系统(同类关系数据库)导入应用守护tcp连接的初始情况表。

几乎所有繁杂的流补救应用守护tcp连接全是有情况表的,其中大多数全是设计为运行数月甚至数年。随着时间的推移,那先 作业积累了统统有价值的情况表,将会将会故障而丢失,那先 情况表的重建将变得代价很高甚至是不将会的。为了保证应用守护tcp连接情况表的一致性和持久性,Flink从一刚刚刚刚刚开始英文就设计了一套繁杂巧妙的检查点和恢复机制。在每有有兩个 版本中,Flink社区都加上了不要 与情况表相关的社会形态,以提高检查点执行和恢复的波特率、改进应用守护tcp连接的维护和管理。

同类,用户也能 创建正在运行的流补救应用守护tcp连接的保存点,并使用批补救守护tcp连接对其进行分析,以验证该应用守护tcp连接的行为是不是正确。 将会,用户可是我需要 任意读取、补救、并写入数据到保存点中,将其用于流计算应用守护tcp连接的初始情况表。 同去,现在也支持修复保存点中情况表不一致的条目。最后,情况表补救器API开辟了其他辦法 来开发有情况表的应用守护tcp连接,以绕过以前为了保证也能 正常恢复而做的诸多限制:用户现在也能 任意修改情况表的数据类型,调整运算符的最大并行度,拆分或合并运算符情况表,重新分配运算符UID等等。

首先,我就们都 看看有情况表的Flink作业是那先 样的。Flink作业由算子(operator)组成,通常是有有兩个 或多个source算子,其他进行数据补救的算子以及有有兩个 或多个sink算子。每个算子在有有兩个 或多个任务中并行运行,但会 也能 使用不同类型的情况表:也能 具有零个,有有兩个 或多个列表形式的operator states,这麼人都 的作用域范围是当前算子实例;将会那先 算子应用于键控流(keyed stream),它也能 具有零个,有有兩个 或多个keyed states,它们的作用域范围是从每个补救记录中提取的键。您也能 将keyed states视为分布式键-值映射。

将会您熟悉Flink的未来规划,将会会对情况表补救器API基于DataSet API而感到惊讶,将会目前Flink社区计划使用BoundedStreams的概念扩展DataStream API,并弃用DataSet API。但会 在设计此情况表补救器功能时,这麼人都 还评估了DataStream API以及Table API,这麼人都 全是能提供相应的功能支持。将会你会此功能的开发但会 受到阻碍,这麼人都 决定先在DataSet API上构建该功能,并将其对DataSet API的依赖性降到最低。基于此,将其迁移到从前API应该是相当容易的。

Flink1.9引入的情况表补救器API,真正改变了你这人现状,实现了对应用守护tcp连接情况表的操作。该功能借助DataSet API,扩展了输入和输出格式以读写保存点或检查点数据。将会DataSet和Table API的互通性,用户甚至也能 使用关系表API或SQL查询来分析和补救情况表数据。

情况表补救器API将流应用守护tcp连接的情况表映射到有有兩个 或多个也能 分别补救的数据集。为了也能使用API​​,您也能 了解此映射的工作辦法 。

Flink用户很长时间以来有从内部内部结构访问和修改流应用守护tcp连接的情况表的需求,借不利于情况表补救器API,Flink为用户怎么维护和管理流应用守护tcp连接打开了其他新将会性,包括流应用守护tcp连接的任意演变以及应用守护tcp连接情况表的导出和引导。简而言之,情况表补救器API得保存点不再是有有兩个 黑匣子。

下图显示的应用守护tcp连接“MyApp”,由称为“Src”,“Proc”和“Snk”的有有兩个 算子组成。Src具有有有兩个 operator state(os1),Proc具有有有兩个 operator state(os2)和有有兩个 keyed state(ks1,ks2),而Snk则是无情况表的。

该图显示了"Src"的operator state的值怎么映射到具有一列和五行的表,一行数据代表对于Src的所有并行任务中的有有兩个 并行实例。同类地,"Proc"的operator state os2,也映射到单个表。对于keyed state,ks1和ks2则是被组合到具有三列的单个表中,一列代表主键,一列代表ks1,一列代表ks2。该表为有有兩个 keyed state的每个不同key都保有一行。将会“Snk”这麼任何情况表,但会 其映射表为空。

MyApp的保存点或检查点均由所有情况表的数据组成,那先 数据的组织辦法 也能 恢复每个任务的情况表。在使用批补救作业补救保存点(或检查点)的数据时,这麼人都 脑海中也能 将每个任务情况表的数据映射到数据集或表中。将会实际上,这麼人都 也能 将保存点视为数据库。每个算子(由其UID标识)代表有有兩个 名称空间。算子的每个operator state都射到名称空间中的有有兩个 单列专用表,该列保存所有任务的情况表数据。operator的所有keyed state都映射到有有兩个 键值多列表,该表由一列key和与每个key state映射的一列值组成。下图显示了MyApp的保存点怎么映射到数据库

情况表补救器API提供了创建,加载和编写保存点的辦法 。用户也能 从已加载的保存点读取数据集,可是我需要 将数据集转换为情况表并将其加上到保存点中。总之,也能 使用DataSet API的详细功能集来补救那先 数据集。使用那先 辦法 ,也能 补救所有前面提到的用例(以及更多用例)。将会您想详细了解怎么使用情况表补救器API,请查看文档。

在这篇文章中,这麼人都 将解释为那先 此功能对Flink来说怪怪的要,以及该功能的用途和用法。最后,这麼人都 将讨论情况表补救器API的未来规划,以保持与Flink批流统一的未来整体规划一致。

尽管那先 需求的出发点全是合理的,但到目前为止从内部内部结构访问应用守护tcp连接的情况表你这人功能仍然相当有限。Flink的可查询情况表(queryable state)功能只支持基于键的查找(点查询),且不保证返回值的一致性(在应用守护tcp连接地处故障恢复前后,返回值将会不同),但会 可查询情况表只支持读取未必支持修改和写入。此外,情况表的一致性快照:保存点,也是无法访问的,将会这是使用自定义二进制格式进行编码的。