KafkaConsumer 0.10 Java API错误消息:没有分区的当前分配

时间:2016-12-07 02:49:35

标签: java kafka-consumer-api

我正在使用KafkaConsumer 0.10 Java api。我想从特定的分区和特定的偏移量消耗。我查了一下,发现有一个搜索方法,但它抛出异常。任何人都有类似的用例或解决方案吗?

代码:

<url-pattern>/*</url-pattern>

异常

KafkaConsumer<String, byte[]> consumer = new KafkaConsumer<>(consumerProps);
consumer.seek(new TopicPartition("mytopic", 1), 4);

3 个答案:

答案 0 :(得分:32)

seek()之前,您首先需要subscribe()向主题 assign()主题划分给消费者。另外请注意,subscribe()assign()是懒惰的 - 因此,您还需要进行一次&#34;虚拟调用&#34;在poll()之前使用seek()

  

注意:从Kafka 2.0开始,新的poll(Duration timeout)是异步的,并且无法保证在poll返回时您有完整的作业。因此,在使用seek()poll再次刷新作业之前,您可能需要检查作业。 (参见KIP-266了解详情)

如果使用subscribe(),则使用组管理:因此,您可以使用相同的group.id启动多个使用者,并且主题的所有分区将自动分配给组内的所有使用者(每个分区将被分配给组中的单个消费者。

如果您想阅读特定分区,则需要通过assign()使用手动分配。这允许您进行任何所需的任务。

顺便说一下:KafkaConsumer有一个很长的详细类JavaDoc,包括例子。值得一读。

答案 1 :(得分:1)

如果您不想使用 poll()并检索地图记录,并更改偏移本身。 卡夫卡版0.11 试试这个:

...
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");    
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);    
consumer.subscribe(Arrays.asList("Test_topic1", "Test_topic2"));
List<TopicPartition> partitions =consumer.partitionsFor("Test_topic1").stream().map(part->{TopicPartition tp = new TopicPartition(part.topic(),part.partition()); return tp;}).collect(Collectors.toList());
Field coordinatorField = consumer.getClass().getDeclaredField("coordinator"); 
coordinatorField.setAccessible(true);    

ConsumerCoordinator coordinator = (ConsumerCoordinator)coordinatorField.get(consumer);
coordinator.poll(new Date().getTime(), 1000);//Watch out for your local date and time settings
consumer.seekToBeginning(partitions); //or other seek

调查协调员事件。这可确保协调器已知并且消费者已加入该组(如果它正在使用组管理)。如果启用它们,它还会处理周期性的偏移提交。

答案 2 :(得分:0)

请使用消费者。向消费者分配寻求而不是消费者。订阅

这些更改之后,它将正常执行。