确定kafka主题中每个分区中的数据大小

时间:2018-11-26 09:47:39

标签: apache-kafka

只是想知道如何确定Kafka中的每个主题分区占用了多少空间。使用“ kafka-consumer-groups.sh”我们可以确定偏移量,但是我想知道其中有多少空间数据每个分区都在占用..

2 个答案:

答案 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());

如果需要,上面应该很容易修改以返回大小。