首页 > 解决方案 > 如何在共享相同状态的同时横向扩展 Flink?

问题描述

工作负载的语义如下:

Flink 算子从同一个 Kafka 主题中读取事件。每个都event需要由一个昂贵的函数处理f一次,理想情况下,如果不是至少一次。事件之间存在相关性,因此每个事件都应基于累积state(由初始状态的事件累积)来处理。

我们如何在 Flink 中为这个用例水平扩展?我想同时处理事件,但所有事件处理都依赖于相同的状态。在我的用例中,状态的大小将首先上升到 1 TB,然后在 1 TB 左右波动。

标签: apache-flink

解决方案


如果您的应用程序需要一个可供每个事件访问的集中式数据结构,那么该应用程序将无法水平扩展。

Flink 通过独立处理数据流的分区来实现水平扩展。这通常是通过从每个事件中计算一个键并围绕该键对流进行分区来完成的。对于每个不同的键,状态是独立维护的,水平缩放的限制是不同键的数量(键空间的大小)。重新缩放是自动处理的,并通过在并行实例之间重新分片一组键来实现。

Flink 也支持 non-keyed state,但基本原理仍然适用:缩放只能通过对流进行分区来实现,并在每个分区内独立维护状态。


推荐阅读