问题
在模拟进行kafka的生产者发送消息时,发送完消息消费者迟迟接收不到。等到了6000ms超时时间时,生产者端报超时
ERROR Error when sending message to topic gaofengTest2 with key: null, value: 4 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.
分析问题
因为这套kafka不是自己部署的而是公司的测试环境(用的是HDP),不太熟悉配置参数。
所以就只能硬着头皮顺着生产者的报错、kafka的日志去找了
看了kafka/logs/下的server、controller、kafka.err日志根本没动静。初步估计是producer连接出现问题
查看ambari界面中的broker的配置参数
很尴尬,测试环境貌似只是将kafka服务开通了,但是具体的broker等参数没有配置。上图红框中的配置参数在kafka/config/server.properties文件中
broker中的listeners参数代表的是监听的地址端口,如果配置错误,生产者就会连接超时
其中"PLAINTEXT"表示网络协议,在listeners中协议可选的值有PLAINTEXT和SSL,后面的IP地址也可以用"0.0.0.0"表示对所有的网络接口有效,如果IP地址为空表示只对默认的网络接口有效,
事实上还有一个参数advertised.listeners=PLAINTEXT://h110:9092,此参数与listeners=PLAINTEXT://h110:9092的配置
分为如下这几种情况:
- 如果advertised.listeners参数没设置的话,就使用listeners的配置然后发送给消息的生产者和消费者,这个过程其实是生产者和消费者在获取源数据(metadata)。
- 如果两个参数都没配置,那么就使用java.net.InetAddress.getCanonicalHostName()返回的值,对于ipv4,基本就是localhost了。
但是无论哪种情况,地址必须配对,只要这个参数不正确,就会导致生产者就会一直卡死,没有反应,因此只需要把listeners的地址修改成你的服务器地址即可
解决
将参数修改为listeners=PLAINTEXT://h110:9092之后
生产者端模拟如下:
消费者模拟如下:
模拟成功!