文章首发于公众号【大数据学徒】,感兴趣请搜索 dashujuxuetu 或者文末扫码关注。
有两种方法可以通过 Java API 获取 Kafka 的 topic 列表:一是通过 ZooKeeper 的 API,二是通过 Kafka 的 AdminClient API,本文一一介绍并比较它们的不同。
内容提要:
- 环境说明
- 通过 ZooKeeper API 获取
- 通过 AdminClient API 获取
- 总结
1. 环境说明
JDK 版本:1.8
开发环境:IntelliJ IDEA + Maven 插件
本地测试 Kafka:localhost:9092
本地测试 ZooKeeper:localhost:2181
ZooKeeper pom依赖:
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.6</version>
</dependency>
Kafka AdminClient pom依赖:
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.3.1</version>
</dependency>
2. ZooKeeper API 获取
直接上代码:
public static void zookeeperListTopics() throws IOException, KeeperException, InterruptedException {
// 创建 ZooKeeper 对象,三个参数分别是 ZK 的 URL、超时时间和一个 watcher 对象,在这里将 watcher 对象设为空即可
ZooKeeper zk = new ZooKeeper("localhost:2181", 10000, null);
// 查看 /brokers/topics 的子节点
List<String> topics = zk.getChildren("/brokers/topics", false);
System.out.println(topics);
}
输出截图:
topic 列表里包含了用于测试创建的 iamabug 和 test 以及 Kafka 内建的 __consumer_offsets。
3. AdminClient API 获取
public static void kafkaListTopics() throws ExecutionException, InterruptedException {
Properties props = new Properties();
// 只需要提供一个或多个 broker 的 IP 和端口
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
// 创建 AdminClient 对象
AdminClient client = KafkaAdminClient.create(props);
// 获取 topic 列表
Set topics = client.listTopics().names().get();
System.out.println(topics);
}
输出截图:
可以看到,这里没有 __consumer_offset 这个topic。
4. 总结
- AdminClient API 是官方提供的用于管理和查询 Kafka 元数据方法,相比 ZooKeeper 更加正规(比如通过它获取到的 topic 列表不包含 Kafka 内建的 topic,可以防止误操作),推荐使用。
- AdminClient API 在
0.11.0之后的版本才有(参考 KIP-117),因此,低版本的 Kafka 可能只能通过 ZooKeeper 的 API 来进行相关的操作。
欢迎交流讨论,吐槽建议,分享收藏。
勤学似春起之苗,不见其增,日有所长 辍学如磨刀之石,不见其损,日有所亏 关注【大数据学徒】,用技术干货助你日有所长