Flink - 构建作业以最大化吞吐量
Flink - structuring job to maximize throughput
我有 4 种类型的 kafka 主题,每种类型有 65 个主题。目标是对数据进行一些简单的 windowed 聚合并将其写入数据库。
拓扑将类似于:
kafka -> window -> reduce -> db write
在这个组合中的某个地方,我想要/需要做一个 union - 或者可能是几个(取决于每次组合的主题数量)。
主题中的数据流范围为 10K 到 >200K 消息/分钟。
我有一个 30 个核心/节点的四节点 flink 集群。我如何构建这些拓扑来分散负载?
我写这个答案是假设相同类型的 65 个主题中的每一个都包含相同类型的数据。
解决此问题的最简单方法是更改 Kafka 设置,使您有 4 个主题,每个主题有 65 个分区。然后程序中有 4 个数据源,具有高并行度 (65),并且自然分布在集群中。
如果无法更改设置,我认为您可以做两件事:
一种可能的解决方案是创建 FlinkKafkaConsumer 的修改版本,其中一个源可以消耗多个主题(而不是一个主题的多个分区)。有了这个改变,它的工作方式就好像你在使用许多分区,而不是许多主题。如果你想使用这个解决方案,我会 ping 邮件列表以获得一些支持。无论如何,这将是对 Flink 代码的一个有价值的补充。
您可以为每个源分配一个单独的资源组,这将为其分配一个专用插槽。您可以通过 "env.addSource(new FlinkKafkaConsumer(...)).startNewResourceGroup();" 执行此操作。但在这里,观察结果是您尝试在具有 120 个内核(因此可能有 120 个任务槽)的集群上执行 260 个不同的源。您将需要增加槽的数量来容纳所有任务。
我认为第一个选项更好。
我有 4 种类型的 kafka 主题,每种类型有 65 个主题。目标是对数据进行一些简单的 windowed 聚合并将其写入数据库。
拓扑将类似于:
kafka -> window -> reduce -> db write
在这个组合中的某个地方,我想要/需要做一个 union - 或者可能是几个(取决于每次组合的主题数量)。
主题中的数据流范围为 10K 到 >200K 消息/分钟。
我有一个 30 个核心/节点的四节点 flink 集群。我如何构建这些拓扑来分散负载?
我写这个答案是假设相同类型的 65 个主题中的每一个都包含相同类型的数据。
解决此问题的最简单方法是更改 Kafka 设置,使您有 4 个主题,每个主题有 65 个分区。然后程序中有 4 个数据源,具有高并行度 (65),并且自然分布在集群中。
如果无法更改设置,我认为您可以做两件事:
一种可能的解决方案是创建 FlinkKafkaConsumer 的修改版本,其中一个源可以消耗多个主题(而不是一个主题的多个分区)。有了这个改变,它的工作方式就好像你在使用许多分区,而不是许多主题。如果你想使用这个解决方案,我会 ping 邮件列表以获得一些支持。无论如何,这将是对 Flink 代码的一个有价值的补充。
您可以为每个源分配一个单独的资源组,这将为其分配一个专用插槽。您可以通过 "env.addSource(new FlinkKafkaConsumer(...)).startNewResourceGroup();" 执行此操作。但在这里,观察结果是您尝试在具有 120 个内核(因此可能有 120 个任务槽)的集群上执行 260 个不同的源。您将需要增加槽的数量来容纳所有任务。
我认为第一个选项更好。