Kafka:监视分配给分区主题的使用者的延迟

时间:2016-06-09 14:16:09

标签: apache-kafka kafka-consumer-api

我正在使用Kafka 0.9.1新的消费者API。将使用者手动分配给分区。对于这个消费者,我希望看到它的进展(意味着滞后)。由于我添加了group id consumer-tutorial作为属性,我假设我可以使用命令

bin/kafka-consumer-groups.sh --new-consumer --describe --group consumer-tutorial --bootstrap-server localhost:9092

(如此处所述http://www.confluent.io/blog/tutorial-getting-started-with-the-new-apache-kafka-0.9-consumer-client

不幸的是,使用上面的命令没有显示我的使用者组详细信息。因此,我无法监控消费者的进度(它的滞后)。如何在上述场景(手动分配的分区)中监控滞后?

代码是:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "consumer-tutorial");
props.put("key.deserializer", StringDeserializer.class.getName());
props.put("value.deserializer", StringDeserializer.class.getName());
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);


        String topic = "my-topic";
        TopicPartition topicPartition = new TopicPartition(topic, 0);
        consumer.assign(Arrays.asList(topicPartition));
        consumer.seekToBeginning(topicPartition);
try {
  while (true) {
    ConsumerRecords<String, String> records = consumer.poll(1000);
    for (ConsumerRecord<String, String> record : records)
     System.out.println(record.offset() + ": " + record.value());
  consumer.commitSynch();
  }
} finally {
  consumer.close();
}

5 个答案:

答案 0 :(得分:5)

如果您不想编写代码来获取此信息或运行类似命令的工具/ shell脚本,则有N个工具可以捕获Kafka指标,包括消费者滞后。在我的头顶:BurrowSPM for Kafka做得很好。以下是关于Kafka偏移,消费者滞后以及从Kafka通过JMX公开的一些指标得出的一些背景知识。 HTH。

答案 1 :(得分:1)

如果您对消费者群体滞后的JMX曝光感兴趣,这里是我写的代理人: https://github.com/tierhetze/kafka9.offsets

您可以在某个Kafka节点上运行此代理,并向外部读者公开偏移滞后统计信息。

有一些示例如何将此代理与Telegraf一起使用 (https://influxdata.com/time-series-platform/telegraf/)。

最后(结合例如telegraf,Influxdb和grafana),您可以看到几个消费者群体的偏移滞后图。

答案 2 :(得分:0)

kafka-consumer-groups.sh命令中,您的组名不正确--group consumer-tutorial而不是 consumer-tutorial-group

答案 3 :(得分:0)

您的代码问题与将消费者手动分配给主题分区直接相关。

您在 group.id 属性中指定了一个消费者组,但是,组 ID 仅在您通过 KafkaConsumer.subscribe() API 订阅一个主题(或一组主题)时使用。在您的示例中,您使用的是 .assign() 方法,该方法手动将客户端附加到指定的主题-分区对,而不使用底层消费者组原语。正是由于这个原因,您无法看到消费者滞后。 Burrow 之类的工具在这种情况下将不起作用,因为它们会查询消费者组的偏移量,而后者并不存在。

有两种选择:

  1. 使用 subscribe() API 正确使用消费者组功能。这是 Kafka 的主要用例。但是,seekToBeginning() 在这种情况下也不起作用,因为偏移量将完全由消费者组管理。
  2. 完全删除消费者组并手动管理分区分配和偏移量。这为您提供了最大可能的灵活性,但需要大量工作,您可能会发现自己在重新发明轮子。大多数人不会走这条路,除非 Kafka 的消费群体特性不适合你的需求。

选择将完全取决于您的用例。对于传统的流处理,#1 是惯用的方法。这就是Kafka的设计目的。 #2 意味着您知道自己在做什么,并将所有组管理职责转移到您的应用程序上。

注意:Kafka 没有“部分”模式,您可以在其中进行一些组管理,而 Kafka 则负责其余工作。要么全押,要么根本没有。

答案 4 :(得分:0)

您可以使用名为

的简单而强大的滞后监控工具

prometheus-kafka-consumer-group-exporter

参考以下网址:

https://github.com/braedon/prometheus-kafka-consumer-group-exporter

安装后运行以下命令以在您所需的端口 Prometheus Kafka Consumer Group Exporter 上导出消费者矩阵

/usr/bin/python3 /usr/local/bin/prometheus-kafka-consumer-group-exporter -p PORT -b KAFKA_CLUSTER_IP_PORT

运行上述命令后,验证 http url YOUR-SERVER-IP:PORT 上的数据,如 127.0.0.1:9208

现在您可以将任何 JMX 抓取工具用于仪表板和警报系统。我正在使用普罗米修斯和格拉法纳

这可以在任何共享服务器上运行,例如 [kafka broker、zookeeper 服务器、prometheus 服务器或任何],因为它对系统资源的开销非常低。