簡體   English   中英

如何從Java中獲取kafka服務器的主題列表

[英]How to get topic list from kafka server in Java

我正在使用kafka 0.8版本,非常新的。

我想知道在kafka server創建的主題列表及其元數據。 是否有任何API可以找到這個?

基本上,我需要編寫一個Java消費者,它應該自動發現kafka server任何主題。有API來獲取TopicMetadata ,但這需要topic的名稱作為輸入參數。我需要服務器中存在的所有主題的信息。

與Kafka 0.9.0

您可以使用提供的使用者方法listTopics()列出服務器中的主題;

例如。

Map<String, List<PartitionInfo> > topics;

Properties props = new Properties();
props.put("bootstrap.servers", "1.2.3.4:9092");
props.put("group.id", "test-consumer-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
topics = consumer.listTopics();
consumer.close();

我認為這是最好的方法:

ZkClient zkClient = new ZkClient("zkHost:zkPort");
List<String> topics = JavaConversions.asJavaList(ZkUtils.getAllTopics(zkClient));

一個好的起點是Kafka附帶的示例shell腳本。 在發行版的/ bin目錄中,您可以使用一些shell腳本,其中一個是./kafka-topic-list.sh如果您在未指定主題的情況下運行該腳本,它將返回包含其元數據的所有主題。 請參閱: https//github.com/apache/kafka/blob/0.8/bin/kafka-list-topic.sh

該shell腳本依次運行: https//github.com/apache/kafka/blob/0.8/core/src/main/scala/kafka/admin/ListTopicCommand.scala

以上都是對0.8 Kafka版本的引用,所以如果你使用的是不同的版本(甚至是點差),請務必在github上使用相應的分支/標簽

如果你想從Zookeeper中提取代理或其他kafka信息,那么kafka.utils.ZkUtils提供了一個很好的界面。 這是我要列出所有zookeeper經紀人的代碼(那里有很多其他方法):

List<Broker> listBrokers() {

        final ZkConnection zkConnection = new ZkConnection(connectionString);
        final int sessionTimeoutMs = 10 * 1000;
        final int connectionTimeoutMs = 20 * 1000;
        final ZkClient zkClient = new ZkClient(connectionString,
                                               sessionTimeoutMs,
                                               connectionTimeoutMs,
                                               ZKStringSerializer$.MODULE$);

        final ZkUtils zkUtils = new ZkUtils(zkClient, zkConnection, false);

        scala.collection.JavaConversions.seqAsJavaList(zkUtils.getAllBrokersInCluster());
}

使用Scala:

import java.util.{Properties}
import org.apache.kafka.clients.consumer.KafkaConsumer

object KafkaTest {
  def main(args: Array[String]): Unit = {

    val brokers = args(0)
    val props = new Properties();
    props.put("bootstrap.servers", brokers);
    props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

    val consumer = new KafkaConsumer[String, String](props);
    val topics = consumer.listTopics().keySet();

    println(topics)
  }
}

您可以使用zookeeper API獲取下面提到的代理列表:

    ZooKeeper zk = new ZooKeeper("zookeeperhost, 10000, null);
    List<String> ids = zk.getChildren("/brokers/ids", false);
    List<Map> brokerList = new ArrayList<>();
    ObjectMapper objectMapper = new ObjectMapper();

    for (String id : ids) {
        Map map = objectMapper.readValue(zk.getData("/brokers/ids/" + id, false, null), Map.class);
        brokerList.add(map);
    }

使用此代理列表可使用以下鏈接獲取所有主題

https://cwiki.apache.org/confluence/display/KAFKA/Finding+Topic+and+Partition+Leader

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM