动态修改卡夫卡消息主题
卡夫卡为我们提供一系列的方法来对主,及分区,副本进行管理;
引入如下依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.10.2.1</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.10</artifactId>
<version>0.10.0.1</version>
</dependency>
public class Test {
public static void main(String[] args) {
//createTopic();//创建主题
reallocateReplica("localhost:2181","kfk_test", 2, 3);//zk,主题,分区
//deT();//删除主题
}
public static void createTopic() {
ZkUtils zkUtils = null;
String TOPIC_NAME="Mytest1";
try {
// 参数从左到右,zk的IP端口,会话超时时间,连接超时时间,zk安全验证是否开启
zkUtils = ZkUtils.apply("localhost:2181",
30000, 30000, JaasUtils.isZkSecurityEnabled());
if (!AdminUtils.topicExists(zkUtils, TOPIC_NAME)) {
AdminUtils.createTopic(zkUtils, TOPIC_NAME, 1, 2, new Properties(), new RackAwareMode.Enforced$());
} else {
// TODO 主题存在
System.out.println("jkdscjk");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
zkUtils.close();
}
}
public static void deT() {
ZkUtils zkUtils = ZkUtils.apply("localhost:2181", 300000, 300000, JaasUtils.isZkSecurityEnabled());
// 删除topic 't1'
AdminUtils.deleteTopic(zkUtils, "Mytest");
zkUtils.close();
}
/**
* 分区副本重分配
* @param topic
* @param numTotalPartitions 重分区后的分区数
* @param numReplicasPerPartition 重分区后每个分区的副本数
*/
public static void reallocateReplica(String zk,String topic, int numTotalPartitions, int numReplicasPerPartition) {
ZkUtils zkUtils = ZkUtils.apply(zk, 30000, 30000, JaasUtils.isZkSecurityEnabled());
try {
// 获取broker原数据信息
scala.collection.Seq<BrokerMetadata> brokerMetadata = AdminUtils.getBrokerMetadatas(zkUtils,
AdminUtils.getBrokerMetadatas$default$2(),
AdminUtils.getBrokerMetadatas$default$3());
// 生成新的分区副本分配方案
scala.collection.Map<Object, Seq<Object>> replicaAssign = AdminUtils.assignReplicasToBrokers(brokerMetadata,
numTotalPartitions, // 分区数
numReplicasPerPartition, // 每个分区的副本数
AdminUtils.assignReplicasToBrokers$default$4(),
AdminUtils.assignReplicasToBrokers$default$5());
// 修改分区副本分配方案
AdminUtils.createOrUpdateTopicPartitionAssignmentPathInZK(zkUtils,
topic,
replicaAssign,
null,
true);
} catch (Exception e) {
e.printStackTrace();
} finally {
zkUtils.close();
}
}
}