【问题标题】:Kafka Consumer co-location. (Partition-Consumer allocation logic)卡夫卡消费者托管。 (Partition-Consumer分配逻辑)
【发布时间】:2017-11-21 20:09:51
【问题描述】:

分布式计算的本质是将执行与数据放在一起,或者换句话说,将您的代码发送到您的数据,而不是将您的数据发送到您的代码。这就是Hadoop、Spark等的核心设计。

Kafka / Kafka Streams 是否允许这样的设置?如果是,如何?如果没有,是否有计划,可能作为子项目,例如使用 Kubernetes 或类似的?

我知道我们可以为一个主题定义消费者组,但我不明白如何将分区分配给消费应用程序实例,以及是否可以进行这种分配以支持并置实例。

请让我知道是否有更好的搜索词,因为“kafka 消费者托管”没有取悦谷歌之神:/

【问题讨论】:

    标签: apache-kafka distributed-computing apache-kafka-streams


    【解决方案1】:

    Kafka 模型不同。 Kafka 集群本身只存储数据流。计算发生在 Kafka 集群之外。因此,只有有限的协同定位概念,即数据将始终通过网络发送到执行处理的消费者/流应用程序。

    对于 Kafka Streams,例如,如果您进行连接,则连接的两个输入流的数据子流(基于 Kafka 分区)将位于单个 Kafka Streams 实例中,但可以计算正确的结果。

    请注意,数据流处理是不同的模型,因此“将代码传送到数据”对于批处理而言并不重要。

    【讨论】:

      【解决方案2】:

      我们为什么要拥有它? 尽量减少网络流量? 减少延迟?

      如果可能,希望尝试将每个分区提供给本地消费者。以下任何一种情况都会使这种情况变得不可能或不可取:

      • 代理的主机不运行任何消费者
      • 本地消费者不订阅代理的主题
      • 与一些外部消费者相比,本地消费者超载

      即使是相对简单的StickyAssignor,这个问题也变成了多目标优化:

      • 针对均匀分布的消费者负载进行优化
      • 优化以保留以前分配的分区

      所有,在主题分布和消费者成员动态变化的情况下!

      下一步是引入一些局部性的数值度量。理想的分配将尝试连接同一主机、机架、数据中心大陆上的代理和消费者。例如,您可能希望使用 ping 时间来衡量进程之间的距离;或跳数。

      另一个维度是主机能力和负载的变化。消费者的主机还能处理多少个分区?

      必须有一种方法可以将所有需求汇总为一个数字:将主题 X 分配给消费者 Y 的效果如何

      最后,您可能会得到一个n * mmatrix of assignment scores:对于每个消费者-代理对,您可能会计算一个分配惩罚。通过solving O(n^3) 的分配问题,您将获得最佳分配,这有利于所有方面,对您的应用程序很重要:

      • 与经纪人的亲密关系
      • 贴近最终用户
      • 消费者的缓存状态
      • 消费者节点的 CPU 负载和可用磁盘空间
      • 可能还有其他一些标准,例如:法规要求、定期维护、运行节点的成本

      Kafka 有一个PartitionAssignor 类,它控制主题和消费者之间的关系。默认是非常简单的算法,但有更复杂的实现,如StickyAssignor,它试图保留消费者的缓存。这是一个pluggable interface,开放供实验。

      卡夫卡的哲学偏爱稳健性和普遍性。也许这就是为什么这种脆弱和多方面的优化不属于标准发行版的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-03
        • 2018-05-05
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 2015-12-18
        相关资源
        最近更新 更多