PyKafka的KafkaClient示例显示Kafka节点被传递给客户端的构造函数:
from pykafka import KafkaClient
client = KafkaClient(hosts="127.0.0.1:9092")
因此,如果我有多个Kafka节点,我可以将它们全部作为主机kw的一部分传递。但是,由于ZooKeeper知道所有Kafka节点,因此似乎更好的方法是传递ZooKeeper集群的位置。
在这种情况下,最佳做法是什么? PyKafka是否支持将ZooKeeper节点传递给客户端构造函数?
答案 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代理的主机名。