Kafka:在多服务器设置上创建主题时 org.apache.zookeeper.KeeperException$NoNodeException

Kafka: org.apache.zookeeper.KeeperException$NoNodeException while creating topic on multi server setup

我正在尝试设置多节点 Kafka-0.8.2.2 集群,其中 1 个生产者、1 个消费者和 3 个代理都在不同的机器上。

producer 上创建主题时,出现 org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /brokers/ids 错误。完整的控制台输出可用 hereKafka Producer 的日志中没有错误。

我用于 运行 Kafka 的命令是:

./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic edwintest

注意:Zookeeper 服务在所有服务器上 运行ning,所有三个代理都在 运行ning 上安装 Kafka 服务器(只有 Brokers 需要 Kafka Server。对吗?).

我的 producer.properties 配置如下:

metadata.broker.list=<IP.OF.BROKER.1>:9092,<IP.OF.BROKER.2>:9092,<IP.OF.BROKER.3>:9092

producer.type=sync

compression.codec=none

serializer.class=kafka.serializer.DefaultEncoder

以下是我用作参考的许多文章中的一些:

乍一看,您似乎正在向本地动物园管理员调用创建主题,而该管理员不知道您的任何 kafka-brooker。你应该打电话给 ./bin/kafka-topics.sh --create --zookeeper <IP.OF.BROKER.1>:2181

问题是因为我试图连接到本地主机的 zookeeper。我的理解是生产者、消费者和 Kafka 代理需要 运行 zookeeper,并且生产者 -> 代理和代理 -> 消费者之间的通信通过 zookeeper 完成。但这是不正确的。实际上:

Zookeeper and Kafka servers should be running only on on broker servers. While creating the topic or publishing the content to the topic, public DNS of any of the Kafka broker should be passed with --zookeeper option. There is no need to run Kafka server on producer or consumer instance.

正确的命令是:

./bin/kafka-topics.sh --create --zookeeper <Public-DNS>:<PORT> --replication-factor 1 --partitions 3 --topic edwintest

其中:Public-DNS 是任何 Kafka 代理的 DNS,PORT 是 Kafka 代理的端口动物园管理员服务。