在对Kafka进行投票时,我使用subscribe()
函数订阅了多个主题。现在,我想设置我想从每个主题中读取的偏移量,而不是在主题的每个seek()
和poll()
之后重新订阅。是否会在每个主题名称上迭代调用seek()
,在轮询数据之前实现结果?
如何将偏移完全存储在Kafka中?
每个主题都有一个分区,只有一个消费者可以阅读所有主题。
答案 0 :(得分:21)
Kafka如何存储每个主题的偏移量?
Kafka已将偏移存储从zookeeper转移到kafka经纪人。原因如下:
Zookeeper不是服务高写入负载(例如偏移更新)的好方法,因为zookeeper路由每个节点通过每个节点写入,因此无法分区或以其他方式扩展写入。我们一直都知道这一点,但是选择这种实现作为一种方便的结合"因为我们已经依赖zk。
Kafka将偏移提交存储在主题中,当使用者提交偏移时,kafka将提交偏移消息发布到" commit-log"主题并保留内存结构,将组/主题/分区映射到最新的偏移量以便快速检索。可以在page about offset management中找到更多设计信息。
现在,我想设置我想从每个主题中读取的偏移量,而不是在每个主题的seek()和poll()之后重新订阅。
kafka管理工具有一个新功能可以重置偏移量。
kafka-consumer-group.sh --bootstrap-server 127.0.0.1:9092 --group
your-consumer-group **--reset-offsets** --to-offset 1 --all-topics --execute
答案 1 :(得分:0)
实际上它是Zookeeper which saves the offsets。
然后,在消费者和特定的group_id 中,您可以选择从特定主题中读取,如下所示:
为此您可以使用该属性:
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
而不是“最早”的其他选项是:
这是Kafka消费者的样本:
public class ConsumerGroup {
public static void main(String[] args) throws Exception {
if(args.length < 2){
System.out.println("Usage: consumer <topic> <groupname>");
return;
}
String topic = args[0];
String group = args[1];
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", group);
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("session.timeout.ms", "30000");
props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
props.put("key.deserializer",
"org.apache.kafka.common.serializa-tion.StringDeserializer");
props.put("value.deserializer",
"org.apache.kafka.common.serializa-tion.StringDeserializer");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList(topic));
System.out.println("Subscribed to topic " + topic);
int i = 0;
while (true) {
ConsumerRecords<String, String> records = con-sumer.poll(100);
for (ConsumerRecord<String, String> record : records)
System.out.printf("offset = %d, key = %s, value = %s\n",
record.offset(), record.key(), record.value());
}
}
}
答案 2 :(得分:-1)
Kafka的抵消存储在消费者一方。每个消费者都会存储每个主题的偏移量,通常是在zookeeper中。