Comment puis-je obtenir le nombre de partitions pour tout sujet kafka à partir du code. J'ai recherché beaucoup de liens mais aucun ne semble fonctionner.
En mentionnant quelques-uns:
http://grokbase.com/t/kafka/users/148132gdzk/find-topic-partition-count-through-simpleclient-api
http://grokbase.com/t/kafka/users/151cv3htga/get-replication-and-partition-count-of-a-topic
http://qnalist.com/questions/5809219/get-replication-and-partition-count-of-a-topic
qui ressemblent à des discussions similaires.
Il existe également des liens similaires sur SO qui ne proposent pas de solution à ce problème.
Accédez à votre répertoire kafka/bin
.
Puis lancez ceci:
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic topic_name
Vous devriez voir ce dont vous avez besoin sous PartitionCount
.
Topic:topic_name PartitionCount:5 ReplicationFactor:1 Configs:
Topic: topic_name Partition: 0 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: topic_name Partition: 1 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: topic_name Partition: 2 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: topic_name Partition: 3 Leader: 1001 Replicas: 1001 Isr: 1001
Topic: topic_name Partition: 4 Leader: 1001 Replicas: 1001 Isr: 1001
Dans les API 0.82 Producer et 0.9 Consumer, vous pouvez utiliser quelque chose comme:
Properties configProperties = new Properties();
configProperties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
configProperties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.Apache.kafka.common.serialization.ByteArraySerializer");
configProperties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.Apache.kafka.common.serialization.StringSerializer");
org.Apache.kafka.clients.producer.Producer producer = new KafkaProducer(configProperties);
producer.partitionsFor("test")
Voici comment je le fais:
/**
* Retrieves list of all partitions IDs of the given {@code topic}.
*
* @param topic
* @param seedBrokers List of known brokers of a Kafka cluster
* @return list of partitions or empty list if none found
*/
public static List<Integer> getPartitionsForTopic(String topic, List<BrokerInfo> seedBrokers) {
List<Integer> partitions = new ArrayList<>();
for (BrokerInfo seed : seedBrokers) {
SimpleConsumer consumer = null;
try {
consumer = new SimpleConsumer(seed.getHost(), seed.getPort(), 20000, 128 * 1024, "partitionLookup");
List<String> topics = Collections.singletonList(topic);
TopicMetadataRequest req = new TopicMetadataRequest(topics);
kafka.javaapi.TopicMetadataResponse resp = consumer.send(req);
// find our partition's metadata
List<TopicMetadata> metaData = resp.topicsMetadata();
for (TopicMetadata item : metaData) {
for (PartitionMetadata part : item.partitionsMetadata()) {
partitions.add(part.partitionId());
}
}
break; // leave on first successful broker (every broker has this info)
} catch (Exception e) {
// try all available brokers, so just report error and go to next one
LOG.error("Error communicating with broker [" + seed + "] to find list of partitions for [" + topic + "]. Reason: " + e);
} finally {
if (consumer != null)
consumer.close();
}
}
return partitions;
}
Notez que je devais simplement extraire les identifiants de partition, mais vous pouvez également extraire toute autre métadonnée de partition, telle que leader
, isr
, replicas
, ...
Et BrokerInfo
est simplement un simple POJO qui a des champs Host
et port
.
En dessous de Shell, cmd peut imprimer le nombre de partitions. Vous devriez être dans le répertoire kafka bin avant d'exécuter le cmd:
sh kafka-topics.sh --describe --zookeeper localhost:2181 --topic **TopicName** | awk '{print $2}' | uniq -c |awk 'NR==2{print "count of partitions=" $1}'
Notez que vous devez modifier le nom du sujet en fonction de vos besoins. Vous pouvez également valider cette utilisation en utilisant la condition si:
sh kafka-topics.sh --describe --zookeeper localhost:2181 --topic **TopicName** | awk '{print $2}' | uniq -c |awk 'NR==2{if ($1=="16") print "valid partitions"}'
La commande cmd ci-dessus imprime les partitions valides si le nombre est égal à 16. Vous pouvez modifier le nombre en fonction de vos besoins.
Ainsi, l'approche suivante fonctionne pour kafka 0.10 et n'utilise aucune API de producteur ou de consommateur. Il utilise certaines classes de l'API scala de kafka, telles que ZkConnection et ZkUtils.
ZkConnection zkConnection = new ZkConnection(zkConnect);
ZkUtils zkUtils = new ZkUtils(zkClient,zkConnection,false);
System.out.println(JavaConversions.mapAsJavaMap(zkUtils.getPartitionAssignmentForTopics(
JavaConversions.asScalaBuffer(topicList))).get("bidlogs_kafka10").size());
J'ai eu le même problème, où je devais obtenir les partitions pour un sujet.
Avec l'aide de la réponse ici j'ai pu obtenir les informations de Zookeeper.
Voici mon code en Scala (mais pourrait être facilement traduit en Java)
import org.Apache.zookeeper.ZooKeeper
def extractPartitionNumberForTopic(topicName: String, zookeeperQurom: String): Int = {
val zk = new ZooKeeper(zookeeperQurom, 10000, null);
val zkNodeName = s"/brokers/topics/$topicName/partitions"
val numPartitions = zk.getChildren(zkNodeName, false).size
zk.close()
numPartitions
}
Cette approche m'a permis d'accéder aux informations sur les sujets relatifs à Kafka ainsi qu'à d'autres informations sur les courtiers Kafka ...
Depuis Zookeeper, vous pouvez vérifier le nombre de partitions d’un sujet en naviguant jusqu’à /brokers/topics/MY_TOPIC_NAME/partitions
.
Utiliser zookeeper-client.sh
pour vous connecter à votre gardien de zoo:
[zk: ZkServer:2181(CONNECTED) 5] ls /brokers/topics/MY_TOPIC_NAME/partitions
[0, 1, 2]
Cela nous montre qu'il y a 3 partitions pour le sujet MY_TOPIC_NAME
//create the kafka producer
def getKafkaProducer: KafkaProducer[String, String] = {
val kafkaProps: Properties = new Properties()
kafkaProps.put("bootstrap.servers", "localhost:9092")
kafkaProps.put("key.serializer",
"org.Apache.kafka.common.serialization.StringSerializer")
kafkaProps.put("value.serializer",
"org.Apache.kafka.common.serialization.StringSerializer")
new KafkaProducer[String, String](kafkaProps)
}
val kafkaProducer = getKafkaProducer
val noOfPartition = kafkaProducer.partitionsFor("TopicName")
println(noOfPartition) //it will print the number of partiton for the given
//topic
@ Sunil-patil repondit avant de repondre a son compte. Vous devez obtenir la taille de la liste
producteur.partitionsFor ("test"). taille ()
@ vish4071 inutile de buter Sunil, vous n'avez pas mentionné que vous utilisez ConsumerConnector dans la question.
cluster.availablePartitionsForTopic(topicName).size()
Vous pouvez explorer le kafka.utils.ZkUtils
qui propose de nombreuses méthodes pour extraire les métadonnées relatives au cluster. Les réponses ici sont Nice, donc je ne fais qu'ajouter par souci de diversité:
import kafka.utils.ZkUtils
import org.I0Itec.zkclient.ZkClient
def getTopicPartitionCount(zookeeperQuorum: String, topic: String): Int = {
val client = new ZkClient(zookeeperQuorum)
val partitionCount = ZkUtils.getAllPartitions(client)
.count(topicPartitionPair => topicPartitionPair.topic == topic)
client.close
partitionCount
}
Le nombre de partitions peut être récupéré de zookeeper-Shell
Syntax: ls /brokers/topics/<topic_name>/partitions
Voici l'exemple:
root@zookeeper-01:/opt/kafka_2.11-2.0.0# bin/zookeeper-Shell.sh zookeeper-01:2181
Connecting to zookeeper-01:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
ls /brokers/topics/test/partitions
[0, 1, 2, 3, 4]
En code Java, nous pouvons utiliser AdminClient
pour obtenir la somme des partitions d’un sujet.
Properties props = new Properties();
props.put("bootstrap.servers", "Host:9092");
AdminClient client = AdminClient.create(props);
DescribeTopicsResult result = client.describeTopics(Arrays.asList("TEST"));
Map<String, KafkaFuture<TopicDescription>> values = result.values();
KafkaFuture<TopicDescription> topicDescription = values.get("TEST");
int partitions = topicDescription.get().partitions().size();
System.out.println(partitions);