繁体   English   中英

如何使用 2.x 版本的 KafkaAdminClient (Java) 获取 Kafka 主题的最新偏移量/大小

[英]How to get latest offset/size of a Kafka topic using KafkaAdminClient (Java) for 2.x version

是否有更有效/更简单的方法来使用Java 中最新的Kafka 客户端 2.4 API获取主题/分区的大小/最新偏移量? 然后,通过比较该组的偏移量与主题的大小来计算该组的 Lag ...

我知道这个问题是针对较旧的 Kafka 版本提出的,并且还有一种方法可以从 Kafka 公开的 JMX 指标中获取此信息,但我坚持使用需要在 Java 中执行此操作但使用最新 2.4 Kafka 库的遗留应用程序。

据我了解,获取此信息的常用方法是:

  • 最简单的部分:使用 KafkaAdminClient 上的 API 调用获取消费者 groupID 的主题/分区的偏移量,例如public ListConsumerGroupOffsetsResult listConsumerGroupOffsets(String groupId, ListConsumerGroupOffsetsOptions options)
  • 最难的部分:确定每个分区的主题大小:
    • 创建一个新的消费者并订阅主题
    • 使用consumer.seekToEnd(...)将消费者推进到最新的偏移量
    • 使用consumer.position(...)获取所有分区的消费者位置
  • 最后,做[size - current offset]来确定每个partition的consumer group的lag

因此,确定最后一个偏移量是一项非常繁重的操作......所以我的问题是:是否有一种更有效的方法可以在不使用虚拟消费者的情况下获取主题的最后一个偏移量,也许在最新的 2.4 API 中? 主题/分区大小信息确实独立于任何消费者,因此在不使用消费者的情况下获得它似乎是合乎逻辑的......

谢谢!

码头

在 kafka 消费应用程序的外部,您是正确的,您的选择是查看分区结束偏移量与消费者组的最新检查点位置(假设有问题的消费者甚至使用 kafka 来存储偏移量)。

有一些工具可以为您监控这一点,例如burrow

但是,如果您可以访问消费应用程序本身,则有一种更准确的方法。 这是所有消费者传感器的列表(默认情况下通过 API 或 jmx 公开) https://kafka.apache.org/documentation/#consumer_fetch_monitoring

有一个每个分区的records-lag指标。 每次调用 poll() 时都会更新它,因此比提交的偏移量更准确且延迟更低。 唯一的复杂之处是您需要对分配给消费者的所有分区中的这些传感器的值求和。

以下是通过KafkaConsumer.metrics()获得它的方法:

private long calcTotalLag(Map<MetricName, ? extends Metric> metrics) {
   long totalLag = 0;
   for (Map.Entry<MetricName, ? extends Metric> entry : metrics.entrySet()) {
     MetricName metricName = entry.getKey();
     Metric metric = entry.getValue();
     Map<String, String> tags = metricName.tags();
     if (metricName.name().equals("records-lag") && tags.containsKey("partition")) {
        totalLag += ((Number) metric.metricValue()).longValue();
     }
   }

   return totalLag;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM