注意:使用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.
答案 0 :(得分:0)
当您订阅主题时,内部会发生大量操作.1。找到组协调员2.发送组请求并获取组长3.领导者将确保任何一个加入组或离开组成员4领导者根据分配策略(如Range / RoundRobin)将分区分配给成员。 5.然后每个消费者成员从组协调员处获取元数据。
然后它将获取记录。因此,在您进行轮询时,首先几次迭代就不会得到任何数据。
答案 1 :(得分:0)
据我所知,它需要前几次迭代来获取记录,但在我的情况下,循环变为无限,'Poll'
无休止地轮询。我今天晚些时候发现,当我使用一些新名称重置组名时(我使用UUID随机化组名),然后它继续使用不同的分区从主题中获取数据。因此,我们得出结论,偏移量需要重置为开头,以便消费者可以从头开始获取数据,并在每次将新的偏移量指针保留在开头时保持组ID。现在我想知道将偏移量设置为主题开头(不是分区)的方法。我尝试使用'props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
&#39;和seek
和seekToBeginning
但是除非消费者已经失去了偏移轨道,否则它们都不会工作..那么有什么方法我可以通过它设置偏移指针到开头?< / p>