卡夫卡让我很困惑。我用标准值在本地运行它。 仅启用自动创建主题。 1个分区,1个节点,一切本地和简单。 如果写的话
consumer.subscribe("test_topic");
consumer.poll(10);
它根本不起作用,永远不会找到任何数据。 如果我改为分配像
这样的分区consumer.assign(new TopicPartition("test_topic",0));
并检查我坐在995的位置。现在可以轮询并接收我的制作人放入的所有数据。
我对订阅的理解是什么?我不需要多个消费者,每个消费者只处理一部分数据。我的消费者需要获取某个主题的所有数据。为什么标准订阅方法对我来说并不适用于所有教程中显示的内容? 我确实知道分区用于负载平衡消费者。我不明白订阅时我做错了什么。
consumer config properties
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "postproc-" + EnvUtils.getAppInst()); // jeder ist eine eigene gruppe -> kriegt alles
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.LongDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer");
KafkaConsumer<Long, byte[]> consumer = new KafkaConsumer<Long, byte[]>(props);
producer config
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 2);
props.put("batch.size", 16384);
props.put("linger.ms", 5000);
props.put("buffer.memory", 1024 * 1024 * 10); // 10mb
props.put("key.serializer", "org.apache.kafka.common.serialization.LongSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
return new KafkaProducer(props);
producer execution
try (ByteArrayOutputStream out = new ByteArrayOutputStream()){
event.writeDelimitedTo(out);
for (long a = 10; a<20;a++){
long rand=new Random(a).nextLong();
producer.send(new ProducerRecord<>("test_topic",rand ,out.toByteArray()));
}
producer.flush();
}catch (IOException e){
消费者执行
consumer.subscribe(Arrays.asList("test_topic"));
ConsumerRecords<Long,byte[]> records = consumer.poll(10);
for (ConsumerRecord<Long,byte[]> r :records){ ...
答案 0 :(得分:3)
我想你错过了这个属性
auto.offset.reset=earliest
当卡夫卡或当前没有初始偏移时该怎么办 服务器上不再存在偏移量(例如,因为该数据 已被删除):
- 最早:自动将偏移重置为最早的偏移量
- 最新:自动将偏移重置为最新偏移量
- none:如果没有找到消费者群组的先前偏移量,则向消费者抛出异常
- 其他任何事情:向消费者抛出异常。
参考:http://kafka.apache.org/documentation.html#highlevelconsumerapi
答案 1 :(得分:3)
我设法解决了这个问题。问题是超时。打桩时,我没有给它足够的时间来完成。我假设分配一个分区只是更快,并且及时完成。标准订阅投票需要更长时间。从未实际完成,也没有提交。 至少我认为这是问题所在。它的工作时间更长。