Flume跨VM连接Kafka实例时出现Connection Refused问题求助
解决Flume跨虚拟机连接Kafka时的连接拒绝问题
这种跨机器的连接坑我之前踩过好几次,咱们一步步来排查解决:
第一步:先确认虚拟机之间的基础网络连通性
- 先在Flume所在的172.16.26.139虚拟机上,ping一下Kafka的IP 172.16.26.138,看看能不能收到响应。如果ping不通,那说明两台虚拟机的网络根本没打通,得先检查虚拟机的网络配置(比如是不是在同一个子网、有没有开启网络隔离)。
- 如果ping通了,再用telnet测试Kafka的默认端口9092:
telnet 172.16.26.138 9092。要是这个也被拒绝,那大概率是Kafka的监听配置不对,或者防火墙挡了这个端口。
第二步:检查Kafka的核心配置(最容易踩坑的点)
Kafka默认只会监听localhost,这就导致只能本机访问,跨机器肯定连不上。你得修改Kafka安装目录下的config/server.properties文件:
- 找到
listeners配置,把它改成listeners=PLAINTEXT://0.0.0.0:9092(或者直接指定Kafka虚拟机的IP:PLAINTEXT://172.16.26.138:9092),这样Kafka就会监听所有网卡的9092端口。 - 还要同步修改
advertised.listeners,这个是Kafka告诉客户端的实际连接地址,必须设置成Flume能访问到的IP:advertised.listeners=PLAINTEXT://172.16.26.138:9092。
改完之后一定要重启Kafka服务,然后再用Flume虚拟机telnet测试9092端口,这时候应该就能连通了。
第三步:核对Flume的配置是否正确
确保你的Flume配置文件里,Kafka Sink的kafka.bootstrap.servers是指向Kafka虚拟机的IP,而不是localhost。比如配置里应该有这样的内容:
# 示例Flume Kafka Sink配置 a1.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink a1.sinks.k1.kafka.bootstrap.servers = 172.16.26.138:9092 a1.sinks.k1.kafka.topic = your-test-topic a1.sinks.k1.kafka.producer.acks = 1 a1.sinks.k1.kafka.producer.batch.size = 16384
第四步:检查虚拟机的防火墙设置
- 在Kafka所在的172.16.26.138虚拟机上,要么临时关闭防火墙测试,要么直接开放9092端口。比如用firewalld的话:
如果是用iptables:firewall-cmd --add-port=9092/tcp --permanent firewall-cmd --reloadiptables -A INPUT -p tcp --dport 9092 -j ACCEPT service iptables save - 另外也要确认Flume所在的172.16.26.139虚拟机,没有拦截 outgoing 的9092端口请求。
最后验证
等所有配置修改完、服务重启后,再用telnet给Flume发消息,看看Flume的DEBUG日志里还会不会出现连接拒绝。同时可以在Kafka虚拟机上用消费者脚本测试:
kafka-console-consumer.sh --bootstrap-server 172.16.26.138:9092 --topic your-test-topic --from-beginning
如果能收到你发的消息,那就说明问题解决啦!
内容的提问来源于stack exchange,提问作者LivinTheDream86
相关产品推荐
相关产品推荐

