如何在共享相同状态的情况下扩展Flink



工作负载的语义如下:

Flink操作符从同一个Kafka主题中读取事件。每个event需要由昂贵的函数f精确地处理一次,理想情况下,如果不是至少处理一次的话。事件之间存在相关性,因此应根据累积state(由初始状态的事件累积(来处理每个事件。

对于Flink中的这个用例,我们如何进行水平缩放?我希望同时处理事件,但所有事件处理都依赖于相同的状态。在我的用例中,状态的大小将首先攀升到1TB,然后在1TB左右波动。

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

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

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

最新更新