如何在共享相同状态的同时横向扩展 Flink?
how do I scale out Flink while sharing the same state?
工作负载的语义如下:
Flink 算子从同一个 Kafka 主题中读取事件。每个 event
都需要由一个昂贵的函数 f
恰好处理一次,理想情况下,如果不是至少一次的话。事件之间存在相关性,所以每个事件都应该根据累积state
(由初始状态的事件累加)来处理。
我们如何在 Flink 中针对这个用例进行水平扩展?我想同时处理事件,但所有事件处理都依赖于相同的状态。在我的用例中,状态的大小将首先攀升至 1 TB,然后在 1 TB 左右波动。
如果您的应用程序需要有一个可供每个事件访问的单一集中式数据结构,那么该应用程序将无法水平扩展。
Flink 通过独立处理数据流的分区来实现水平扩展。这通常是通过从每个事件计算一个键,并围绕该键对流进行分区来完成的。状态为每个不同的键独立维护,水平缩放的限制是不同键的数量(键的大小 space)。重新缩放是自动处理的,并通过在并行实例之间重新分片键集来实现。
Flink 也支持 non-keyed state,但基本原则仍然适用:缩放只能通过对流进行分区,并在每个分区内独立维护状态来实现。
工作负载的语义如下:
Flink 算子从同一个 Kafka 主题中读取事件。每个 event
都需要由一个昂贵的函数 f
恰好处理一次,理想情况下,如果不是至少一次的话。事件之间存在相关性,所以每个事件都应该根据累积state
(由初始状态的事件累加)来处理。
我们如何在 Flink 中针对这个用例进行水平扩展?我想同时处理事件,但所有事件处理都依赖于相同的状态。在我的用例中,状态的大小将首先攀升至 1 TB,然后在 1 TB 左右波动。
如果您的应用程序需要有一个可供每个事件访问的单一集中式数据结构,那么该应用程序将无法水平扩展。
Flink 通过独立处理数据流的分区来实现水平扩展。这通常是通过从每个事件计算一个键,并围绕该键对流进行分区来完成的。状态为每个不同的键独立维护,水平缩放的限制是不同键的数量(键的大小 space)。重新缩放是自动处理的,并通过在并行实例之间重新分片键集来实现。
Flink 也支持 non-keyed state,但基本原则仍然适用:缩放只能通过对流进行分区,并在每个分区内独立维护状态来实现。