Java 为什么所有分区都不分配给正在运行的单个KafkanConsumer?
我正在尝试读取“输入主题”中的最后3条记录。 我只使用一个消费者。 但它只消耗来自一个分区的记录 当我手动分配其他分区时,会出现一个错误:“您只能检查分配给此使用者的分区的位置。” 但我使用的是单一消费者。 我无法理解这个问题。 如果可能的话,请帮助我Java 为什么所有分区都不分配给正在运行的单个KafkanConsumer?,java,apache-kafka,kafka-consumer-api,Java,Apache Kafka,Kafka Consumer Api,我正在尝试读取“输入主题”中的最后3条记录。 我只使用一个消费者。 但它只消耗来自一个分区的记录 当我手动分配其他分区时,会出现一个错误:“您只能检查分配给此使用者的分区的位置。” 但我使用的是单一消费者。 我无法理解这个问题。 如果可能的话,请帮助我 Properties properties = new Properties(); properties.setProperty(ConsumerConfig.CLIENT_ID_CONFIG,"4"); properties.setProper
Properties properties = new Properties();
properties.setProperty(ConsumerConfig.CLIENT_ID_CONFIG,"4");
properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
properties.setProperty(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"earliest");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
String topic = "input_topic";
TopicPartition topicPartition = new TopicPartition(topic, 0);
TopicPartition topicPartition1 = new TopicPartition(topic, 1);
TopicPartition topicPartition2 = new TopicPartition(topic, 2);
List<TopicPartition> topics = Arrays.asList(topicPartition1,topicPartition,topicPartition2);
while (true) {
Thread.sleep(5000);
consumer.assign(topics);
consumer.seekToEnd(topics);
long current = consumer.position(topicPartition);
consumer.seek(topicPartition, current-3);
ConsumerRecords<String, String> records = consumer.poll(100);
System.out.println("-------------------------------------------> "+ records.count());
System.out.println("-------------------------------------------> "+ LocalDateTime.now());
for (ConsumerRecord<String, String> record : records) {
System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value());
System.out.println("_________________________" + record.partition());
}
}
Properties属性=新属性();
setProperty(ConsumerConfig.CLIENT_ID_CONFIG,“4”);
setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,“localhost:9092”);
properties.setProperty(ConsumerConfig.VALUE_反序列化程序_CLASS_CONFIG,StringDeserializer.CLASS.getName());
设置属性(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,“最早”);
卡夫卡消费者=新卡夫卡消费者(财产);
String topic=“输入主题”;
TopicPartition TopicPartition=新的TopicPartition(主题,0);
topicPartition1=新的TopicPartition(主题,1);
topicPartition2=新的TopicPartition(主题,2);
列表主题=Arrays.asList(topicPartition1、topicPartition、topicPartition2);
while(true){
睡眠(5000);
消费者。分配(主题);
consumer.seekToEnd(主题);
长电流=耗电元件位置(topicPartition);
consumer.seek(主题分区,current-3);
ConsumerRecords记录=consumer.poll(100);
System.out.println(“---------------------------------------->”+records.count());
System.out.println(“---------------------------------------->”+LocalDateTime.now());
对于(消费者记录:记录){
System.out.printf(“偏移量=%d,键=%s,值=%s”,record.offset(),record.key(),record.value());
System.out.println(“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;
}
}
我猜。。。除了Hatice所说的assign
应该只在循环之外执行一次,我从您的代码中看到了这一点。
您在所有主题分区的末尾查找位置,然后仅在主题分区0的最后3条记录的偏移量上查找。
此时,轮询只能使用来自主题分区0的3条记录,而不能使用来自其他分区的3条记录,因为您在这些记录上的位置已到末尾(当然,如果您没有向这些分区发送更多消息,这是正确的).您能粘贴错误的完整堆栈跟踪吗?为什么在while循环中调用assign方法?看来应该做一次。