添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
天涯  ·  [KAFKA-7188] Avoid ...·  1 月前    · 
天涯  ·  使用LM ...·  1 月前    · 
天涯  ·  韩宝贝 ...·  1 月前    · 
天涯  ·  OpenAI 开源音频转文字模型 ...·  1 月前    · 
天涯  ·  PyCharm运行是报错:ModuleNot ...·  1 月前    · 
天涯  ·  ... make sure you ...·  1 月前    · 
直爽的猴子  ·  无颜之月录制第4集__bilibili·  9 小时前    · 
善良的麦片  ·  齐齐哈尔三家子机场·  9 小时前    · 

由于项目需求,需要跨集群向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盘的某个路径,打开属性,属性--->安全---->编辑,然后把除完全控制的其他权限全部勾选,如图 IOExceptionJava中的一个受检查异常(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界
 
推荐文章