原来使用的好好的消费者的python代码就是读取不到数据。
反复确认,和topic、group_id都没问题。重启kafka容器,没有解决,重启惠普笔记本电脑,解决了(第一次以为解决了,实际没真解决)。能读取到数据了。莫名其妙
我本机docker启动的kafka没有问题,但是我另外一台centos启动的kafka有问题
看上图,我在本机104和centos215上查看的topic消息数量不一致。
在104上查看的,即使制定了215的broker-list,还是查询的本机的。
--分割线1----------------------------------------------
后来又出现一样的问题,重启215惠普笔记本,还是没解决。
但是发现启动本机104的docker安装kafka后,往 215kafka 发送消息就能成功。
我猜测原因是104和215可能形成了一个kafka集群。而实际上我在本机发送的消息,虽然指定的215,但实际上连的是104。
因为我在215和104实用脚本查询的topic的偏移量是不一样的。
--分割线2----------------------------------------------
而后,我销毁了215的kafka,重建了,使用下面语句:
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 --link zookeeper -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://xx.xxx.xxx.215:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
这样启动的kafka,是能从外面主机访问的。
之前我使用的是下面命令(应该主要是localhost要修改成宿主机ip):
docker run -d --name kafka --publish 9092:9092 --link zookeeper \
--restart=always \
--env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=localhost \
--env KAFKA_ADVERTISED_PORT=9092 \
wurstmeister/kafka:latest
另外,由于kafka销毁了,但是 zookeeper我没动,因此 原来的 topic有问题,要使用新建的topic才还用,这也是一个坑。 老的topic报错还是超时,让人以为还是网络或防火墙问题。
我之前花了大量时间确定docker的端口暴露没有问题,宿主机防火墙没有开启。
--分割线3-------------------------------------------------------
小结一下,使用老的 docker run 参数启动的 kafka,在 docker里面使用完全没有问题。但是在其他主机producer发送消息后使用get确认消息是否发送成功就会报超时错误。但是如果你自己的机器又启动了一个kafka,使用sh脚本的producer,发送消息到对方的kafka能成功。而且,你使用telnet ip 端口 测试网络是完全正常的。使用 ssh -v -p 看也是成功建立链接的。
这就是 我感觉莫名其妙的原因。
--分割线4--------------------------------------------------------
提供一些 命令和 脚本:
kafka-console-producer.sh生产无key消息
进入到kafka的bin目录下:执行以下脚本:
./kafka-console-producer.sh --broker-list List<host:port> --topic topicName
在下面的console中输入value后点击enter键即完成数据的生产
kafka-console-consumer.sh消费消息后不输出key
进入到kafka的bin目录下:执行以下脚本:(注:0.11之前配置的是--zookeeper,0.11后变成了--bootstrap-server)
./kafka-console-consumer.sh --zookeeper(bootstrap-server) List<host:port> --from-beginning --topic topicName
消费完毕后打印出消费的value值
最简单的生产者代码
from kafka import KafkaProducer
# 连接 Kafka 集群
kafka_ip_port = 'x.x.x.215:9092'
producer = KafkaProducer(bootstrap_servers=kafka_ip_port)
# 指定主题
topic = 'lzf_topic'
print(kafka_ip_port, topic)
# 发送消息
producer.send(topic, b'Hello, World!').get(timeout=10)
producer.send(topic, key=b'message-two', value=b'This is message two').get(timeout=10)
producer.flush()
print('ok')
# 关闭连接
producer.close()
最简单的消费者代码
from kafka import KafkaConsumer
# 定义Kafka的主机和端口号
bootstrap_servers = '10.4.100.215:9092'
# 定义要消费的主题
topic = 'lzf_topic'
# 创建Kafka消费者
consumer = KafkaConsumer(topic, bootstrap_servers=bootstrap_servers)
print('连接到 Kafka 服务器:', bootstrap_servers, consumer.bootstrap_connected(), '订阅主题:', consumer.subscription())
# 消费消息
for message in consumer:
# 打印消息的键和值
print(f'Value: {message.value.decode("utf-8")}')
# 关闭Kafka消费者连接
consumer.close()