在Kafka中,如何让消费者从本地分区消费?
in Kafka, how to make consumers consume from local partition?
只是为了简化场景。
消费者数量 == 分区数量 == Kafka 代理数量
如果consumer和broker部署在同一台机器上,如何让每个consumer只在本地消费消息?目的是削减所有网络开销。
我想如果每个消费者都能知道他们机器上的partition_id,我们就可以做到,但我不知道怎么做?或者有其他方向可以解决这个问题吗?
谢谢。
bin/kafka-topics.sh --zookeeper [zk address] --describe --topic [topic_name]
告诉您哪个代理托管每个分区的领导者。然后您可以为每个消费者使用手动分区分配,以确保它从本地分区消费。
也许您可以使用管理客户端 API。
首先,您可以使用 describeTopics() 方法获取有关集群中主题的信息。从 DescribeTopicResult 中,您可以访问 TopicPartitionInfo,其中包含有关每个主题的分区的信息。从那里您可以通过 leader() 访问节点。节点包含 host(),您可以检查它是否与您的消费者 运行 或 id() 的主机相同,并且消费者应该在同一台机器上拥有有关代理 ID 运行 的信息(通常这是您可以预先定义的信息)。有关 Admin Client API 的更多信息,请参见以下 JavaDoc:
https://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/admin/AdminClient.html
可能不值得付出努力,因为分区领导层可能会发生变化,然后您将不得不重新平衡所有消费者以再次成为本地消费者。只需将复制因子从 3 减少到 2,您就可以更轻松地节省相同数量的网络带宽。
只是为了简化场景。
消费者数量 == 分区数量 == Kafka 代理数量
如果consumer和broker部署在同一台机器上,如何让每个consumer只在本地消费消息?目的是削减所有网络开销。
我想如果每个消费者都能知道他们机器上的partition_id,我们就可以做到,但我不知道怎么做?或者有其他方向可以解决这个问题吗?
谢谢。
bin/kafka-topics.sh --zookeeper [zk address] --describe --topic [topic_name]
告诉您哪个代理托管每个分区的领导者。然后您可以为每个消费者使用手动分区分配,以确保它从本地分区消费。
也许您可以使用管理客户端 API。 首先,您可以使用 describeTopics() 方法获取有关集群中主题的信息。从 DescribeTopicResult 中,您可以访问 TopicPartitionInfo,其中包含有关每个主题的分区的信息。从那里您可以通过 leader() 访问节点。节点包含 host(),您可以检查它是否与您的消费者 运行 或 id() 的主机相同,并且消费者应该在同一台机器上拥有有关代理 ID 运行 的信息(通常这是您可以预先定义的信息)。有关 Admin Client API 的更多信息,请参见以下 JavaDoc:
https://kafka.apache.org/0110/javadoc/index.html?org/apache/kafka/clients/admin/AdminClient.html
可能不值得付出努力,因为分区领导层可能会发生变化,然后您将不得不重新平衡所有消费者以再次成为本地消费者。只需将复制因子从 3 减少到 2,您就可以更轻松地节省相同数量的网络带宽。