kafka get partition count for a topic

前端 未结 15 1080
萌比男神i
萌比男神i 2020-12-13 00:05

How can I get number of partitions for any kafka topic from the code. I have researched many links but none seem to work.

Mentioning a few:

http://grokbase.c

相关标签:
15条回答
  • 2020-12-13 00:34

    In java code we can use AdminClient to get sum partions of one topic.

    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 讨论(0)
  • 2020-12-13 00:36

    Here's how I do it:

      /**
       * 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) {
        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);
    
            List<Integer> partitions = new ArrayList<>();
            // find our partition's metadata
            List<TopicMetadata> metaData = resp.topicsMetadata();
            for (TopicMetadata item : metaData) {
              for (PartitionMetadata part : item.partitionsMetadata()) {
                partitions.add(part.partitionId());
              }
            }
            return partitions;  // 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();
          }
        }
        throw new RuntimeError("Could not get partitions");
      }
    

    Note that I just needed to pull out partition IDs, but you can additionally retrieve any other partition metadata, like leader, isr, replicas, ...
    And BrokerInfo is just a simple POJO that has host and port fields.

    0 讨论(0)
  • 2020-12-13 00:37

    In the 0.82 Producer API and 0.9 Consumer api you can use something like

    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")
    
    0 讨论(0)
  • 2020-12-13 00:37

    Use PartitionList from KafkaConsumer

         //create consumer then loop through topics
        KafkaConsumer<String, String> consumer = new KafkaConsumer<String, String>(props);
        List<PartitionInfo> partitions = consumer.partitionsFor(topic);
    
        ArrayList<Integer> partitionList = new ArrayList<>();
        System.out.println(partitions.get(0).partition());
    
        for(int i = 0; i < partitions.size(); i++){
            partitionList.add(partitions.get(i).partition());
        }
    
        Collections.sort(partitionList);
    

    Should work like a charm. Let me know if there's a simpler way to access Partition List from Topic.

    0 讨论(0)
  • 2020-12-13 00:37

    You can explore the kafka.utils.ZkUtils which has many methods aimed to help extract metadata about the cluster. The answers here are nice so I'm just adding for the sake of diversity:

    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
    }
    
    0 讨论(0)
  • 2020-12-13 00:39
    //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
    
    0 讨论(0)
提交回复
热议问题