web-dev-qa-db-fra.com

kafka obtient le nombre de partitions pour un sujet

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.

16
vish4071

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
36
peter.petrov

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")
7
Sunil Patil

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.

5
Marko Bonaci

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.

4
MD5

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());
4

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

2
user1314742
//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
1
Raman Mishra

@ 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. 

1
Andy
cluster.availablePartitionsForTopic(topicName).size()
1
gstackoverflow

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
}
1
Danny Mor

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]
1
Hackaholic

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);
0
TongChen