主题管理
主题
创建主题
手动创建
-
命令(kafka的bin目录下):kafka-topics.sh -zookeeper localhost:2181 --create --topic topicname --partitions 2 --replication-factor 1
-
localhost:2181 zookeeper所在的ip,zookeeper必传参数,多个zookeeper用逗号隔开
-
paratitions用来设置topic分区数
-
replication-factor主题副本数,每个副本分布在不同节点,不能超过总节点数。
-
自动创建
生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。不过我们一般不建议将auto.create.topics.enable参数设置为true,因为这个参数会影响topic的管理与维护。
server.properties中配置auto.create.topics.enable=true,还可以num.partitions配置自动分区数,default.replication.factor配置自动副本数
查看topic元数据信息
- 连接:命令(zookeeper的bin目录下):./zkCli.sh -server localhost:2181
- 查看:get /brokers/topics/topicname
查看主题
- 查看所有主题(kafka的bin目录下):./kafka-topics.sh --zookeeper localhost:2181 --list
- 查看指定主题:./kafka-topics.sh --zookeeper 192.168.0.191:2181 --describe --topic topicname
修改主题
增加修改配置
-
修改主题分区数为4:./kafka-topics.sh --zookpeeper localhost:2181 --alter --topic topicname --partitions 4
只能增加分区,减少分区会报错,其他参数一样设置,
-
增加配置:./kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicname --config flush.messages=1
删除配置
- ./kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicname --delete-config flush.messages
删除主题
- delete.topic.enable=true,直接删除topic
- delete.topic.enable=false
- topic没有使用过,可以彻底删除
- topic使用过,并没有真正删除,只是标记为删除(marked for deletion),重启Kafka Server后删除
- ./kafaka-topics.sh --zookeeper localhost:2181 --delete --topic topicname
分区
增加分区
- ./kafka-topics.sh --zookpeeper localhost:2181 --alter --topic topicname --partitions 4,只能增加,不能减少
Topic其他参数
KafkaAdminClient
public class MyAdminClient {
private static final String brokerList = "192.168.0.191:9092";
private static final String topic = "jpy";
public static AdminClient init() {
Properties properties = new Properties();
properties.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, brokerList);
properties.put(AdminClientConfig.REQUEST_TIMEOUT_MS_CONFIG, 30000);
return AdminClient.create(properties);
}
public static void main(String[] args) {
addPartition();//修改分区
describeTopic();//主题信息
describeTopicConfig();//查看主题配置
alterConfig();//修改配置
createTopic();//创建主题
topicList();//所有主题
deleteTopic();//删除主题
}
//修改分区数量
public static void addPartition() {
AdminClient client = init();
//修改分区数量
NewPartitions newPartitions = NewPartitions.increaseTo(4);
Map<String, NewPartitions> newPartitionsMap = new HashMap<>();
newPartitionsMap.put(topic, newPartitions);
CreatePartitionsResult result = client.createPartitions(newPartitionsMap);
try {
result.all().get();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//主题详细信息
public static void describeTopic() {
AdminClient client = init();
DescribeTopicsResult describeTopicsResult = client.describeTopics(Arrays.asList(topic));
try {
Map<String, TopicDescription> stringTopicDescriptionMap = describeTopicsResult.all().get();
System.out.println(stringTopicDescriptionMap);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//查看主题配置
public static void describeTopicConfig() {
AdminClient client = init();
ConfigResource resource = new ConfigResource(ConfigResource.Type.TOPIC, topic);
DescribeConfigsResult result = client.describeConfigs(Arrays.asList(resource));
try {
Config config = result.all().get().get(resource);
System.out.println(config);
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//修改配置
public static void alterConfig() {
AdminClient client = init();
Map<ConfigResource, Collection<AlterConfigOp>> configMap = new HashMap<>();
ConfigResource configResource = new ConfigResource(ConfigResource.Type.TOPIC, topic);
AlterConfigOp alterConfigOp = new AlterConfigOp(new ConfigEntry("preallocate", "false"), AlterConfigOp.OpType.SET);
configMap.put(configResource, Arrays.asList(alterConfigOp));
AlterConfigsResult alterConfigsResult = client.incrementalAlterConfigs(configMap);
try {
alterConfigsResult.all().get();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//创建主题
public static void createTopic() {
AdminClient client = init();
CreateTopicsResult result = client.createTopics(Arrays.asList(new NewTopic("m", 3, (short) 1)));
try {
result.all().get();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//查看所有主题
public static void topicList() {
AdminClient client = init();
/*ListTopicsOptions options = new ListTopicsOptions();
//是否查看Internet选项,不显示内部topic,offsets
options.listInternal(true);
ListTopicsResult listTopicsResult = client.listTopics(options);*/
ListTopicsResult listTopicsResult = client.listTopics();
try {
Set<String> set = listTopicsResult.names().get();
//输出topic的名字
set.forEach(System.out::println);//所有topic名字
Collection<TopicListing> topicListings = listTopicsResult.listings().get();
//输出topic信息,名字和internal
topicListings.forEach(System.out::println);//(name=jpy,internal=false),.....
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
//删除主题
public static void deleteTopic() {
AdminClient client = init();
DeleteTopicsResult deleteTopicsResult = client.deleteTopics(Arrays.asList(topic));
try {
//执行删除
deleteTopicsResult.all().get();
} catch (Exception e) {
e.printStackTrace();
} finally {
client.close();
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY