只是想知道如何确定Kafka中的每个主题分区占用了多少空间。使用“ kafka-consumer-groups.sh”我们可以确定偏移量,但是我想知道其中有多少空间数据每个分区都在占用..
答案 0 :(得分:1)
使用AdminClient,您可以使用describeReplicaLogDirs()
查找分区(每个副本)的大小。
如上所述,这是每个副本的副本,因此,如果分区具有多个副本,则可以查询全部副本,也可以仅查询领导者,具体取决于您要如何计算磁盘上的大小。
答案 1 :(得分:0)
老问题,但万一其他人正在调查这个......
我没有使用 describeReplicaLogDirs(上面提到过),但我可能使用了不同版本的库。
我必须确定特定主题的任何分区是否有任何数据,这是我的处理方法:
String topic = <topic searched for>;
AdminClient kafkaAdminClient = AdminClient.create(<Kafka properties>);
// From another question in SO
List<Integer> brokers = kafkaAdminClient.describeCluster().nodes().get().stream()
.mapToInt(Node::id).boxed().collect(toList());
// Get the descriptionLogDirs for all the topics partitions/replicas
DescribeLogDirsResult replicaLogDirs = kafkaAdminClient.describeLogDirs(brokers);
return replicaLogDirs.values().entrySet() //Stream<Map.Entry<Integer, KafkaFuture<Map<String, LogDirInfo>>>>
.stream().map(t -> getMap(t.getValue()).values())
.flatMap(Collection::stream) // Stream<LogDirInfo>
.map(t -> t.replicaInfos) // Stream<Map<TopicPartition, ReplicaInfo>>
.anyMatch(a -> a.entrySet().stream()
.filter(b -> b.getKey().topic().equals(topic) && b.getValue().size > 0L)
.peek(n -> log.info("Found partition {} for topic {} with size {}", n.getKey().partition(), n.getKey().topic(), n.getValue().size))
.findFirst().isPresent());
如果需要,上面应该很容易修改以返回大小。