Python脚本连接Docker Kafka容器遇NoBrokersAvailable错误求助
错误原因分析
- Python代码配置被覆盖:你先初始化了带
bootstrap_servers=['kafka:9092']的Producer实例,但紧接着又执行producer=KafkaProducer(),直接把配置好的实例替换成了默认参数的新实例(默认bootstrap地址是localhost:9092),导致Producer无法找到正确的Broker地址。 - Kafka容器监听配置缺失:Debezium Kafka镜像需要显式配置
ADVERTISED_LISTENERS,否则Broker会向客户端暴露容器内部的网络地址,外部客户端(比如宿主机上的Python代码)无法解析该地址,最终连接失败。
解决方法
修正Python代码
删除重复初始化Producer的代码,保留正确的配置(根据代码运行环境选择对应的bootstrap地址):
from kafka import KafkaProducer import json from csv import DictReader # 代码在宿主机运行时用['localhost:9092'],在Docker容器内(和Kafka同网络)用['kafka:9092'] bootstrap_servers = ['localhost:9092'] topicname='test-topic' # 仅初始化一次Producer,可将序列化逻辑整合到初始化参数中 producer = KafkaProducer( bootstrap_servers=bootstrap_servers, value_serializer=lambda v: json.dumps(v).encode('utf-8') ) with open('test_data_producer.csv', 'r') as new_obj: csv_dict_reader = DictReader(new_obj) for row in csv_dict_reader: ack = producer.send(topicname, row) metadata = ack.get() print(metadata.topic, metadata.partition)
修正Docker Compose配置
为Kafka容器添加监听地址相关环境变量,同时用depends_on替代过时的links:
kafka: container_name: kafka image: debezium/kafka:latest ports: - "0.0.0.0:9092:9092" depends_on: - zookeeper environment: - ZOOKEEPER_CONNECT=zookeeper:2181 - ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092,PLAINTEXT_INTERNAL://kafka:9092 - LISTENERS=PLAINTEXT://0.0.0.0:9092,PLAINTEXT_INTERNAL://0.0.0.0:9093 - INTER_BROKER_LISTENER_NAME=PLAINTEXT_INTERNAL volumes: - ./kafka/data:/kafka/data - ./kafka/logs:/kafka/logs
参数说明:
LISTENERS:定义Kafka监听的端口,外部客户端用9092,Broker内部通信用9093ADVERTISED_LISTENERS:告知客户端连接地址,宿主机用localhost:9092,Docker内部服务用kafka:9092INTER_BROKER_LISTENER_NAME:指定Broker之间通信使用的监听地址
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

