package com.neverwinterdp.kafka.tool; import kafka.cluster.Broker; import kafka.javaapi.PartitionMetadata; import kafka.javaapi.TopicMetadata; import com.neverwinterdp.tool.server.Server; import com.neverwinterdp.kafka.tool.server.KafkaCluster; public class KafkaClusterTool { private KafkaCluster cluster; public KafkaClusterTool(KafkaCluster cluster) { this.cluster = cluster; } public void killLeader(String topic, int partition) throws Exception { findLeader(topic, partition).shutdown(); } public void restartLeader(String topic, int partition) throws Exception { Server server = findLeader(topic, partition); server.shutdown(); server.start(); } Server findLeader(String topic, int partition) throws Exception { KafkaTool kafkaTool = new KafkaTool("KafkaPartitionLeaderKiller", cluster.getZKConnect()); kafkaTool.connect(); TopicMetadata topicMeta = kafkaTool.findTopicMetadata(topic); PartitionMetadata partitionMeta = findPartition(topicMeta, partition); Broker partitionLeader = partitionMeta.leader(); Server kafkaServer = cluster.findKafkaServerByPort(partitionLeader.port()); System.out.println("Shutdown kafka server " + kafkaServer.getPort()); kafkaTool.close(); return kafkaServer; } PartitionMetadata findPartition(TopicMetadata topicMetadata, int partition) { for (PartitionMetadata sel : topicMetadata.partitionsMetadata()) { if (sel.partitionId() == partition) return sel; } throw new RuntimeException("Cannot find the partition " + partition); } }