卡夫卡消费者共同所在地。 (分区 - 消费者分配逻辑)

时间:2017-11-21 20:09:52

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

分布式计算的本质是将执行与数据共同定位,换句话说,将代码发送到数据,而不是将数据发送到代码。这是Hadoop,Spark等的核心设计。

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

我知道我们可以为某个主题定义消费者群组,但我不了解如何将分区分配给消费应用程序实例,以及是否可以进行此分配以支持共置实例。

请告诉我是否有更好的术语来搜索" kafka消费者同位置"并没有取悦谷歌的神:/

2 个答案:

答案 0 :(得分:0)

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

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

请注意,数据流处理是一种不同的模型,因此将代码传送到数据"对于批处理来说并不重要。

答案 1 :(得分:0)

我们为什么要拥有那个? 要最大限度地减少网络流量? 减少延迟?

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

  • 经纪人的主机没有运行任何使用者
  • 本地消费者不订阅经纪人的话题
  • 与一些外部消费者相比,本地消费者超负荷

即使是相对简单的StickyAssignor,这个问题仍然是多目标优化:

  • 针对用户负载均匀分布进行优化
  • 优化以保留先前分配的分区

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

下一步将是介绍位置的一些数字量度。理想的分配方式是尝试在同一台主机,机架,数据中心大陆上连接经纪人和消费者。例如,您可能希望使用ping时间来度量进程之间的距离。或许多跳数。

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

必须有一种将所有需求汇总为一个数字的方法:主题X对消费者Y的分配有多好。

最后,您可能会得到n * m matrix of assignment scores:对于每个消费者-经纪人对,您都可以计算出分配损失。在O(n^3)时间内solving遇到分配问题,您将获得最佳分配,这有利于所有方面,对您的应用程序很重要:

  • 与布罗克的亲密关系
  • 与最终用户的亲近
  • 消费者的缓存状态
  • 使用者节点的CPU负载和可用磁盘空间
  • 也许是其他一些标准,例如:法规要求,计划的维护,运行节点的成本

Kafka具有PartitionAssignor类,该类控制“主题”和“消费者”之间的关系。默认是一种非常简单的算法,但是还有更复杂的实现,例如StickyAssignor,它试图保留使用者的缓存。它是pluggable interface,可以进行实验。

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