由于项目需求,需要跨集群向kafka发数据,发数据程序所在集群没有配置目标kafka集群的主机名,所以只能使用目标集群的ip地址。经测试两个集群网络通信是没有问题的。但是发kafka数据程序运行一直报错,显示无法解析kafka主机名。
约定:
由于跨集群发kafka数据,程序运行所在集群和目标kafka集群属于2个不同集群。为方便描述,程序运行所在集群简称为A集群,目标kafka集群为B集群。
1 程序主要代码
final static String KAFKA_BROKER_LIST
= "172.25.102.70:9092,172.25.102.71:9092,172.25.102.72:9092,172.25.102.75:9092,172.25.102.76:9092";
Properties props = buildKafkaProperties(KAFKA_BROKER_LIST);
KafkaProducer producer = new KafkaProducer<String, String>(props);
String to_topic = "liu-text-20200507";
String record = "message record";
producer.send(new ProducerRecord<String, String>(to_topic,
null,
record));
producer.close();
//构造kafka配置参数
public static Properties buildKafkaProperties(String kafka_broker_list){
Properties props = new Properties();
props.put("bootstrap.servers", kafka_broker_list);
props.put("acks", "all"); //是否成功的标准
props.put("retries", "3"); //重试次数
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
return props;
由代码中可知,我传入的地址是ip,而不是目标kafka主机域名。
2 程序错误信息
2020-05-07 11:41 WARN kafka-producer-network-thread | producer-1 clients.NetworkClient:873 - [Producer clientId=producer-1] Error connecting to node kafka-05:9092 (id: 115 rack: null)
java.io.IOException: Can't resolve address: kafka-05:9092
at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235)
at org.apache.kafka.common.network.Selector.connect(Selector.java:214)
at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864)
at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265)
at org.apache.kafka.clients.producer.internals.Sender.sendProducerData(Sender.java:266)
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:238)
at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:176)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.nio.channels.UnresolvedAddressException
at sun.nio.ch.Net.checkAddress(Net.java:101)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622)
at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233)
... 7 more
错误提示未解析的地址异常,不认识主机域名 kafka-05!
3 初步推断
注意:A,B集群为上文约定的简称
应当是构造kafkaproducer的时候,和B集群通信时,在B集群根据ip地址反解析了B集群的主机名列表,拿回到A集群,然后作为kafkaproducer的通信地址,结果查询A集群hosts,并没有找到这些主机名对应的ip地址,因此才报出错误。
4 debug程序排查
debug程序时发现
a) 构造kafkaproducer的时候,的确会有反解析主机名的操作,不过时根据A集群本身的hosts配置,如果自己hosts并没有配置这些ip域名,则仍然使用ip列表作为地址。所以问题并不发生在本阶段
b) send数据时,kafkaproducer会和B集群kafka的broker进行通信,在B集群拿到了B集群的kafka主机域名,并更新kafkaproducer本身的通信地址。到真正发数据时,在A集群查询kafka主机域名时,发现并没有找到,然后又尝试一步步查询外网所有DNS域名服务器(这一步非常耗时!),结果还是没有查到,导致解析主机名失败,抛出异常!
注:kafkaproducer根据ip到达B集群,查询kafka broker元数据时,查询的是kafka配置的zookeeper,我们进入B集群的zookeeper,可以查看kafka元数据信息。
进入zookeeper命令窗口后,进行下列操作
[zk: localhost:2181(CONNECTED) 0] ls /brokers/ids
[201, 202, 203, 204, 205]
[zk: localhost:2181(CONNECTED) 1] get /brokers/ids/201
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://kafka-01:9092"],"jmx_port":9393,"host":"kafka-01","timestamp":"1585815634552","port":9092,"version":4}
可以看到每个kafka broker都可以查到host主机名和port端口号
5 解决办法
在A集群上所有计算节点配上B集群kafka所有主机名映射ip,避免B集群反解析出域名,返回A集群解析这些kafka主机名失败。然后就可以愉快的向B集群kafka发数据了!
flume系列之:消费Kafka集群Topic报错java.io.IOException: Can't resolve address: data03:9092。
文章目录1. 背景说明2. 初级难度 - 无认证Kafka3. 中级难度 - SASL/PLAIN认证Kafka4. 有人捣乱的难度 - Ambari中SASL/PLAIN认证Kafka
我曾经在不同的场景下给Kafka配置域名,难度各有不同,这篇文章按照从易到难的顺序介绍三种难度下给Kafka配置域名的方法。
1. 背景说明
在默认的Kafka配置下,客户端与Kafka集群通信都是通过brok...
一、问题描述
项目启动正常,但是启动后发现某些功能有问题,查看日志发现,kafka报错:
java.io.IOException: Can’t resolve address: t3-xxx-examserv-web04:9092
但是搜索了下java项目的application.properties,关于kafka的配置只配置了ip,并没有配置主机名:
kafka.bootstrap.servers=10.123.123.123
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_272]
Caused by: java.nio.channels.UnresolvedAddressException: null
at sun.nio.ch.Net.checkAddress(Net.java:104) ~[na:1.8.0_272
在Kafka中配置域名可以帮助我们更好地管理和维护我们的集群。在本文中,我将详细介绍如何配置Kafka的域名,并提供相应的源代码示例。Kafka使用Zookeeper来管理其集群的元数据和配置信息。因此,为了配置Kafka的域名,我们需要修改Zookeeper的配置文件。配置文件的修改需要重启Zookeeper和Kafka才能生效。至此,您已成功配置Kafka的域名。现在,您可以使用域名来连接和管理您的Kafka集群。在完成修改后,保存并关闭Zookeeper的配置文件。替换为您希望使用的域名。
java.io.IOException: 拒绝访问,原因是访问权限不够,查看代码访问的盘符,修改权限。
例如:访问D盘的某个路径,打开属性,属性--->安全---->编辑,然后把除完全控制的其他权限全部勾选,如图
IOException是Java中的一个受检查异常(Checked Exception)。它是java.io包中定义的异常类之一,用于表示输入输出操作期间可能发生的错误或异常情况。
阿里云上 部署Kafka 启动报错java.io.IOException: Can't resolve address.
本地调试的,报错
需要在本地添加阿里云主机的 host 映射
linux kafka server 192.168.0.141 hostnamebogon
在windows
java 代码
package myzookeeper;
impo...
[customer] 2020-08-13 16:23:32.984 WARN [kafka-producer-network-thread | producer-1] [NetworkClient ] [Producer clientId=producer-1] Error connecting to node iZuf65paliafsmaw
cdh6.2 应用程序(python,java,go)使用comsumer消费kafka 使用ip:9092连接,总是去访问主机名,反过来解析不到ip
解决办法1:
把kafka broker hosts信息配置到应用端hosts
解决办法2:
去zk中获取kafka ids相关信息:
zookeeper-client
ls /brokers/ids
get /brokers/ids/104
结果显示,zk中是去解析hostsname的,以上不同版本的kafka可能路径不一样,酌情调整查询
在cdh cm界