【问题标题】:how do I scale out Flink while sharing the same state?如何在共享相同状态的同时横向扩展 Flink?
【发布时间】:2023-03-07 09:01:01
【问题描述】:

工作负载的语义如下:

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

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

【问题讨论】:

    标签: apache-flink


    【解决方案1】:

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

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

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

    【讨论】:

    • scaling can only be achieved by partitioning the stream, and maintaining state independently within each partition. 谢谢!这是否意味着每个并行实例将读取所有事件,然后有选择地按键处理事件?重新分片在哪里以及如何工作?
    • 没有。 Flink 扩展到具有数千个节点的集群,吞吐量以每秒数十亿个事件为单位。如果每个实例都必须触及不可能发生的每个事件。相反,键控分区各自处理不相交的子流。至于重新缩放,这需要获取集群状态的全局快照,并从该快照重新启动集群。
    • keyed partitions are each processing disjoint substreams 这是从消息队列端还是在 flink 端完成的?如果在 flink 端,它是由作业经理或调度员完成的还是在哪里完成的?我似乎没有找到从 AWS SQS 中仅读取选定事件的方法。
    • 这从消息队列端开始。为大规模设计的分布式日志,如 Kinesis(以及 Kafka、Pulsar 等)将主题分片存储在单独的服务器上,以便消费者可以独立操作,Flink 就利用了这一点。当 Flink 需要对数据进行重新分区时,可以使用 keyBy(和其他相关操作)来引起网络 shuffle,其中工作人员之间交换数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多