Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么所有分区都不分配给正在运行的单个KafkanConsumer?_Java_Apache Kafka_Kafka Consumer Api - Fatal编程技术网

Java 为什么所有分区都不分配给正在运行的单个KafkanConsumer?

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

我正在尝试读取“输入主题”中的最后3条记录。 我只使用一个消费者。 但它只消耗来自一个分区的记录

当我手动分配其他分区时,会出现一个错误:“您只能检查分配给此使用者的分区的位置。” 但我使用的是单一消费者。 我无法理解这个问题。 如果可能的话,请帮助我

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方法?看来应该做一次。