kafka莫名其妙的问题

原来使用的好好的消费者的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()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值