我正在使用kafka 0.8
版本,而且非常新。
我想知道在kafka server
中创建的主题列表
元数据。
是否有任何API可以找到这个?
基本上,我需要编写一个Java使用者,它应该自动发现kafka server
中的任何主题。有API可以获取TopicMetadata
,但这需要主题名称作为输入
参数。我需要服务器中存在的所有主题的信息。
答案 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