如何在Java中从kafka服务器获取主题列表
我使用的是如何在Java中从kafka服务器获取主题列表,java,apache-kafka,Java,Apache Kafka,我使用的是kafka 0.8版本,非常新 我想知道在kafka服务器中创建的主题列表以及它的 元数据。 有什么API可以找到这一点吗 基本上,我需要编写一个Java使用者,它应该自动发现kafka服务器中的任何主题 参数。我需要服务器中所有主题的信息。最好从Kafka附带的示例shell脚本开始。 在发行版的/bin目录中,可以使用一些shell脚本,其中一个是./kafka-topic-list.sh 如果您在不指定主题的情况下运行它,它将返回所有主题及其元数据。 见: 该shell脚本依次
kafka 0.8
版本,非常新
我想知道在kafka服务器中创建的主题列表以及它的
元数据。
有什么API可以找到这一点吗
基本上,我需要编写一个Java使用者,它应该自动发现kafka服务器中的任何主题
参数。我需要服务器中所有主题的信息。最好从Kafka附带的示例shell脚本开始。
在发行版的/bin目录中,可以使用一些shell脚本,其中一个是./kafka-topic-list.sh
如果您在不指定主题的情况下运行它,它将返回所有主题及其元数据。
见:
该shell脚本依次运行:
以上都是对0.8卡夫卡版本的引用,因此如果您使用的是不同的版本(甚至是点差异),请确保在github上使用适当的分支/标记。您可以使用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);
}
ZooKeeper zk=新的ZooKeeper(“zookeeperhost,10000,空);
List id=zk.getChildren(“/brokers/id”,false);
List brokerList=new ArrayList();
ObjectMapper ObjectMapper=新的ObjectMapper();
用于(字符串id:ids){
Map Map=objectMapper.readValue(zk.getData(“/brokers/ids/”+id,false,null),Map.class);
添加(地图);
}
使用此代理列表通过以下链接获取所有主题
卡夫卡0.9.0版
您可以使用提供的使用者方法listTopics()在服务器中列出主题
例如
地图主题;
Properties props=新属性();
道具放置(“bootstrap.servers”,“1.2.3.4:9092”);
props.put(“group.id”,“测试消费者组”);
put(“key.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
put(“value.deserializer”、“org.apache.kafka.common.serialization.StringDeserializer”);
卡夫卡消费者=新卡夫卡消费者(道具);
topics=consumer.listTopics();
consumer.close();
如果您想从Zookeeper中提取代理或其他卡夫卡信息,那么kafka.utils.ZkUtils
提供了一个很好的界面。下面是我必须列出所有Zookeeper代理的代码(还有很多其他方法):
列出listBrokers(){
最终ZkConnection ZkConnection=新ZkConnection(connectionString);
最终int sessionTimeoutMs=10*1000;
最终int连接TimeOutms=20*1000;
最终ZkClient ZkClient=新ZkClient(connectionString,
会话时间,
connectionTimeoutMs,
ZKStringSerializer$.MODULE$);
final ZkUtils ZkUtils=新的ZkUtils(zkClient,zkConnection,false);
seqAsJavaList(zkUtils.getAllBrokerIncluster());
}
我认为这是最好的方法:
ZkClient zkClient = new ZkClient("zkHost:zkPort");
List<String> topics = JavaConversions.asJavaList(ZkUtils.getAllTopics(zkClient));
ZkClient-ZkClient=newzkclient(“zkHost:zkPort”);
List topics=JavaConversions.asJavaList(ZkUtils.getAllTopics(zkClient));
使用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)
}
}
如果你正在寻找java api,不幸的是,目前除了你提到的版本0.9.xThanks之外,没有其他版本。这正是我要找的!OP询问的主题列表不是broker你得到了broker列表,然后得到了主题,上面的方法有什么错。只是代码段没有提供答案和链接所做的比所要求的要多。与其使用链接,不如将解决方案嵌入到您的答案中。OP所要求的主题列表不是Brokers这些可以从windows上运行的java应用程序远程执行吗?
ZkClient zkClient = new ZkClient("zkHost:zkPort");
List<String> topics = JavaConversions.asJavaList(ZkUtils.getAllTopics(zkClient));
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)
}
}