獲取 Kafka 中某個主題的分區計數
一、簡介
在本教程中,我們將了解檢索 Kafka 主題的分區總數的不同方法。在簡短介紹什麼是 Kafka 分區以及為什麼我們可能需要檢索此信息後,我們將編寫 Java 代碼來執行此操作。然後我們將了解如何使用 CLI 獲取此信息。
2.Kafka分區
一個Kafka Topic可以分為多個分區。擁有多個分區的目標是能夠同時使用來自同一主題的消息。因為擁有比現有分區更多的消費者是沒有用的,所以一個主題中 Kafka 分區的數量代表了消費的最大並行度。因此,提前了解給定主題有多少個分區對於正確調整各個消費者的大小非常有用。
3. 使用 Java 檢索分區號
要使用 Java 檢索特定主題的分區數量,我們可以依靠[KafkaProducer.partitionFor(topic)](https://kafka.apache.org/26/javadoc/org/apache/kafka/clients/producer/KafkaProducer.html#partitionsFor-java.lang.String-)
方法。此方法將返回給定主題的分區元數據:
Properties producerProperties = new Properties();
// producerProperties.put("key","value") ...
KafkaProducer<String, String> producer = new KafkaProducer<>(producerProperties)
List<PartitionInfo> info = producer.partitionsFor(TOPIC);
Assertions.assertEquals(3, info.size());
此方法返回的PartitionInfo
列表的大小將恰好等於為特定主題配置的分區數。
如果我們無法訪問Producer
,我們可以使用 Kafka AdminClient
以稍微複雜的方式獲得相同的結果:
Properties props = new Properties();
// props.put("key","value") ...
AdminClient client = AdminClient.create(props)){
DescribeTopicsResult describeTopicsResult = client.describeTopics(Collections.singletonList(TOPIC));
Map<String, KafkaFuture> values = describeTopicsResult.values();
KafkaFuture topicDescription = values.get(TOPIC);
Assertions.assertEquals(3, topicDescription.get().partitions().size());
在本例中,我們依賴KafkaClient.describeTopic(topic)
方法,該方法返回一個DescribeTopicsResult
對象,其中包含要執行的未來任務的Map
。這裡我們只檢索我們需要的Topic
的TopicDescription
,最後檢索分區的數量。
4. 使用 CLI 檢索分區號
我們有幾個選項可以使用 CLI 檢索給定主題的分區數量。
首先,我們可以依賴每次 Kafka 安裝和運行時附帶的 shell 腳本:
$ kafka-topics --describe --bootstrap-server localhost:9092 --topic topic_name
此命令將輸出指定主題的完整描述:
Topic:topic_name PartitionCount:3 ReplicationFactor:1 Configs: ...
另一種選擇是使用Kafkacat ,它是 Kafka 的非基於 JVM 的消費者和生產者。通過元數據列表模式 ( -L)
,此 shell 實用程序顯示 Kafka 集群的當前狀態,包括其所有主題和分區。要顯示特定主題的元數據信息,我們可以運行以下命令:
$ kafkacat -L -b localhost:9092 -t topic_name
該命令的輸出將是:
Metadata for topic topic_name (from broker 1: mybroker:9092/1):
topic "topic_name" with 3 partitions:
partition 0, leader 3, replicas: 1,2,3, isrs: 1,2,3
partition 1, leader 1, replicas: 1,2,3, isrs: 1,2,3
partition 2, leader 1, replicas: 1,2, isrs: 1,2
我們可以看到這個 shell 實用程序命令還如何顯示有關特定主題及其分區的有用詳細信息。
5. 結論
在這個簡短的教程中,我們了解瞭如何使用 Java 和 CLI 檢索特定 Kafka 主題的分區總數。
我們首先了解了為什麼檢索此信息很有用,然後我們使用了KafkaProducer
和KafkaAdmin
。最後,我們將 shell 命令與 Kafka 腳本實用程序和 KafkaCat 一起使用。
與往常一樣,本文的完整源代碼可以在 GitHub 上獲取。