为什么Kafka Consumer API不从主题的多个分区中获取数据

时间:2016-06-21 12:09:31

标签: apache-kafka kafka-consumer-api

注意:使用kafka_2.11-0.9.0.1

我创建了一个名为consumer-tutorials的kafka主题3 Partitions,如下所示:

C:\kafka_2.11-0.9.0.1>.\bin\windows\kafka-topics.bat --describe --topic consumer-tutorial
--zookeeper localhost:2181
Topic:consumer-tutorial PartitionCount:3        ReplicationFactor:1     Configs:
        Topic: consumer-tutorial        Partition: 0    Leader: 0       Replicas: 0     Isr: 0
        Topic: consumer-tutorial        Partition: 1    Leader: 0       Replicas: 0     Isr: 0
        Topic: consumer-tutorial        Partition: 2    Leader: 0       Replicas: 0     Isr: 0

创建主题后,我使用Producer API在每个分区中生成了一些数据,如下所示:

KafkaProducer<String,String> prod = new KafkaProducer<String,String>(props); 

for(int i =0; i < 3; i++)
{
    for(int x=start; x<end; x++)
    {
        prod.send(new ProducerRecord<String,String>("consumer-tutorial",i,Integer.toString(x),Integer.toString(rnd.nextInt(100))));     }
    start=end;
    end = start + 10;
}
prod.close();

现在,当我尝试使用以下consumer-tutorial从此主题Consumer API获取记录/使用消息时:

KafkaConsumer<String,String> consumer = new KafkaConsumer<String,String>(props);
consumer.subscribe(Arrays.asList("consumer-tutorial"));

while(true)
{
    ConsumerRecords<String, String> records = consumer.poll(100);

    for(ConsumerRecord<String,String> record: records)
    {
        System.out.printf("Key: %s, Value = %s", record.key(), record.value());
    }

}

运行此代码时,我没有收到任何记录。我检查了record变量,但没有来自KEY:VALUE

Poll

Watch on "records" shows nothing

任何人都可以帮助我,为什么我没有显示任何数据。

NOTE: It works well when I have single partition topic.

2 个答案:

答案 0 :(得分:0)

当您订阅主题时,内部会发生大量操作.1。找到组协调员2.发送组请求并获取组长3.领导者将确保任何一个加入组或离开组成员4领导者根据分配策略(如Range / RoundRobin)将分区分配给成员。 5.然后每个消费者成员从组协调员处获取元数据。

然后它将获取记录。因此,在您进行轮询时,首先几次迭代就不会得到任何数据。

答案 1 :(得分:0)

据我所知,它需要前几次迭代来获取记录,但在我的情况下,循环变为无限,'Poll'无休止地轮询。我今天晚些时候发现,当我使用一些新名称重置组名时(我使用UUID随机化组名),然后它继续使用不同的分区从主题中获取数据。因此,我们得出结论,偏移量需要重置为开头,以便消费者可以从头开始获取数据,并在每次将新的偏移量指针保留在开头时保持组ID。现在我想知道将偏移量设置为主题开头(不是分区)的方法。我尝试使用'props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");&#39;和seekseekToBeginning但是除非消费者已经失去了偏移轨道,否则它们都不会工作..那么有什么方法我可以通过它设置偏移指针到开头?< / p>