我应该将ZooKeeper节点传递给PyKafka的KafkaClient吗?

时间:2016-01-25 18:51:22

标签: python apache-kafka

PyKafka的KafkaClient示例显示Kafka节点被传递给客户端的构造函数:

from pykafka import KafkaClient
client = KafkaClient(hosts="127.0.0.1:9092")

因此,如果我有多个Kafka节点,我可以将它们全部作为主机kw的一部分传递。但是,由于ZooKeeper知道所有Kafka节点,因此似乎更好的方法是传递ZooKeeper集群的位置。

在这种情况下,最佳做法是什么? PyKafka是否支持将ZooKeeper节点传递给客户端构造函数?

2 个答案:

答案 0 :(得分:1)

对于KafkaClient,没有必要。您可以提供以逗号分隔的kafka主机列表,用于连接(此处为:http://pykafka.readthedocs.org/en/latest/api/client.html)或KazooClient连接字符串(包含zookeeper信息,zookeeper的主机和端口)。从_get_metadata()函数的源代码,集群对象从zookeeper获取代理信息(如果提供了zookeeper主机ips。这里https://github.com/Parsely/pykafka/blob/1b2d030b073f276c18fd6b1a64320de58d4d7904/pykafka/cluster.py)。

对于其他客户端,例如pykafka.balancedconsumer.BalancedConsumer,您可能需要提供zookeeper信息(http://pykafka.readthedocs.org/en/latest/api/balancedconsumer.html)。

顺便说一下,仔细阅读文档,并不是现在在python客户端中实现了java客户端或协议中定义的所有功能。

答案 1 :(得分:0)

为了澄清这里的讨论:自this pull request以来,PyKafka已在zookeeper_hosts上支持KafkaClient作为kwarg。这允许用户在实例化客户端时指定zookeeper或kafka节点 - zookeeper_hosts在指定时优先于hosts。这只是为了方便而提供的 - 除了BalancedConsumer之外,任何PyKafka组件都不一定非常需要了解zookeeper主机。在KafkaClient实例化期间使用时,zookeeper_hosts仅用于自动发现Kafka代理的主机名。