在 Flink 中的算子之间共享状态

Posted

技术标签:

【中文标题】在 Flink 中的算子之间共享状态【英文标题】:Share state among operators in Flink 【发布时间】:2017-02-22 05:29:06 【问题描述】:

我想知道在 Flink 中是否可以在算子之间共享状态。

例如,假设我在一个运算符上通过键进行分区,我需要分区 A 内的一个分区状态 C(出于任何原因)(图 1.a),或者我需要下游运营商F 中运营商C 的状态(图1.b)。

我知道可以broadcast 记录到所有分区。因此,如果您在记录中包含操作员的内部状态,您可以与下游操作员共享您的内部状态。 但是,这可能是一项昂贵的操作,而不是简单地让op1 专门要求op2 状态。

最近围绕可查询状态的发展是否朝着这个概念发展,或者它们只是为了让外部用户查询拓扑的内部状态?

提前感谢您的见解

【问题讨论】:

【参考方案1】:

一般来说,Flink 的设计不允许读取或写入相同或不同算子的其他子任务的状态。正如您所说,您可以使用broadcast 使状态在全球范围内可用。可查询状态功能适用于外部用户查询。

但是,我听说有用户在操作员中利用此功能从同一作业的其他操作员那里获取数据。我不知道这有多好(稳定性和性能方面)。如果您想尝试一下,我会指向用户邮件列表进行更深入的技术讨论。

【讨论】:

以上是关于在 Flink 中的算子之间共享状态的主要内容,如果未能解决你的问题,请参考以下文章

影响 Flink 有状态函数和算子性能的 3 个重要因素

Flink rescale state 调整有状态算子的并行度

FLINK基础(92): DS算子与窗口单流算子KeyBy

Flink 快照分析:定位大状态和数据倾斜的算子

Flink单流算子

Flink State