没有可用的代理:没有可用的代理-Kafka错误

17

我已经开始学习Kafka了,正在尝试进行基本操作。但是我在“Brokers”这个点上遇到了困难。

我的Kafka正在运行,但是当我想创建一个分区时却卡住了。

 from kafka import TopicPartition
(ERROR THERE) consumer = KafkaConsumer(bootstrap_servers='localhost:1234')
 consumer.assign([TopicPartition('foobar', 2)])
 msg = next(consumer)
traceback (most recent call last): File "", line 1, in File "/usr/local/lib/python2.7/dist-packages/kafka/consumer/group.py", line 284, in init self._client = KafkaClient(metrics=self._metrics, **self.config) File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 202, in init self.config['api_version'] = self.check_version(timeout=check_timeout) File "/usr/local/lib/python2.7/dist-packages/kafka/client_async.py", line 791, in check_version raise Errors.NoBrokersAvailable() kafka.errors.NoBrokersAvailable: NoBrokersAvailable

创建Kafka数据管道的步骤。请点击下面的链接。https://dev59.com/31sV5IYBdhLWcg3w4iA_#49212019 - Dry_accountant_09
7个回答

42

在使用Kafka流时,我也遇到了同样的错误。下面的代码解决了我的错误:我们需要在KafkaProducer中定义API版本。

KafkaProducer(bootstrap_servers=['localhost:9092'],
              api_version=(0,11,5),
              value_serializer=lambda x: dumps(x).encode('utf-8'))

你能详细说明一下如何获取那个 api_version 吗?它和 Kafka broker 版本是一样的吗? - Shawn

8

您不能在消费者内创建分区。分区是在创建主题时创建的。例如,使用命令行工具:

bin/kafka-topics.sh \
  --zookeeper localhost:2181 \
  --create --topic myNewTopic \
  --partitions 10 \
  --replication-factor 3

这将创建一个名为"myNewTopic"的新主题,它有10个分区(从0到9编号),并且副本因子为3。如果想了解更多信息,请参阅http://docs.confluent.io/3.0.0/kafka/post-deployment.html#admin-operationshttps://kafka.apache.org/documentation.html#quickstart_createtopic
在您的消费者中,如果调用assign(),这意味着您想要消费相应的分区,而此分区必须已经存在。

6
我遇到的问题是防火墙规则,因为我在Google Cloud上运行Kafka。昨天它还好好的,今天我想了一个小时也没有弄明白为什么它不再工作了。
由于我本地系统的公共IP地址每次连接到不同的局域网或WiFi时都会更改,所以我必须在防火墙规则中允许我的本地系统的公共IP。建议使用具有固定公共IP的连接,或在切换/更改连接时检查此问题。
这些配置中的小变化需要耗费很长时间来调试和修复。感觉浪费了一个小时在这上面。

5

不知道这个答案是否仍然相关,但最近解决了在VBox VM中代理无法从主机Windows OS访问的同样问题。由于您在KafkaConsumer中提到了bootsrap_servers,我假设您至少使用了kafka 0.10.0.0。

请在server.properties文件中查找 advertised.listeners 属性,并将其设置为 PLAINTEXT:// localhost:9092 PLAINTEXT://<broker_ip>:9092

但在设置之前,请确保您的代理服务器可以从运行您的Consumer的环境中访问(通过执行 ping <broker_ip>和netcat nc -vz <broker_ip> 9092 )。

此外,您需要重新启动kafka-server和consumer / producer(无论哪个正在运行),然后尝试发送/接收。

例如,如果您正在运行VM,则可能希望使用Host-only适配器使代理服务器从主机机器可访问

注意:此配置适用于Kafka Server>=0.10.X.X,但不适用于0.8.2.X。没有检查过0.9.0.X


3
看起来您想开始消费消息而不是创建分区。无论如何 - 您能够在端口1234上访问Kafka吗?9092是kafka的默认端口,也许您可以尝试使用此端口。如果您找到了正确的端口但应用程序仍然出现错误,则可以尝试使用控制台消费者测试您的设置:
bin/kafka-console-producer.sh --broker-list localhost: --topic foobar 控制台消费者是标准kafka发行版的一部分。也许这会让您离问题的源头更近一步。

2

在IT技术中,使用127.0.0.1代替localhost或其他与使用场景相关的IP地址。将localhost:9092更改为127.0.0.1:9092对我起了作用。

from kafka import KafkaConsumer
consumer = KafkaConsumer('topicname',bootstrap_servers=['127.0.0.1:9092'])
print(consumer.config)
print(consumer.bootstrap_connected())

1
NoBrokersAvailable 可能是 Kafka 配置中主机名配置错误的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接