[英]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.