如何从Java中获取kafka服务器的主题列表

时间:2014-07-23 05:08:42

标签: java apache-kafka

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

我想知道在kafka server中创建的主题列表 元数据。 是否有任何API可以找到这个?

基本上,我需要编写一个Java使用者,它应该自动发现kafka server中的任何主题。有API可以获取TopicMetadata,但这需要主题名称作为输入 参数。我需要服务器中存在的所有主题的信息。

6 个答案:

答案 0 :(得分:25)

与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();

答案 1 :(得分:5)

我认为这是最好的方法:

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

答案 2 :(得分:4)

一个好的起点是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上使用相应的分支/标记

答案 3 :(得分:1)

如果你想从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());
}

答案 4 :(得分:1)

使用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)
  }
}

答案 5 :(得分:0)

您可以使用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