我有一群kafka经纪人。我正在尝试获取主题级别的指标,对于位于代码指向的特定代理上的主题,我已经成功完成了该指标。 Zookeeper返回所有经纪人上所有主题的列表。当我尝试获取每个主题的指标时,这会导致失败。
我正在使用此功能从Zookeeper获取主题列表:
ZooKeeper zk = new ZooKeeper("kafka.ip:port", 1000, null);
return zk.getChildren("/brokers/topics", false);
要获取主题指标,我正在使用JMX。 JMX连接器仅指向单个代理。当我用来获取指标的代码碰到该代理上不存在的主题时,它会失败,因为该主题在代理眼中并不存在。
这导致了我的问题:是否有办法让某个话题持续存在的经纪人?有没有更好的方法可以做到这一点?
谢谢!
答案 0 :(得分:1)
要获取主题分区所在的代理,可以使用AdminClient界面。像
AdminClient kafkaClient = new AdminClient(properties))
DescribeTopicsResult result = kafkaClient.describeTopics(Collections.singleton(topicName));
Map<String, TopicDescription> descriptions = result.all().get();
descriptions.values().stream().forEach(t->{
t.partitions().stream().forEach(p->{
Node leader = p.leader(); //here is a leader for partition
List<Node> replicas = p.replicas(); //here are the replicas
});
});
尽管我不确定这对您来说是个好主意。
答案 1 :(得分:0)
通常,Kafka主题分为多个分区。这些分区分布在多个代理中。考虑到这一点,您还不清楚要获得什么。