Kafka如何为每个主题存储偏移量?

时间:2017-08-15 05:22:26

标签: java apache-kafka kafka-consumer-api

在对Kafka进行投票时,我使用subscribe()函数订阅了多个主题。现在,我想设置我想从每个主题中读取的偏移量,而不是在主题的每个seek()poll()之后重新订阅。是否会在每个主题名称上迭代调用seek()在轮询数据之前实现结果? 如何将偏移完全存储在Kafka中?

每个主题都有一个分区,只有一个消费者可以阅读所有主题。

3 个答案:

答案 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

more options you can use

答案 1 :(得分:0)

实际上它是Zookeeper which saves the offsets

然后,在消费者和特定的group_id 中,您可以选择从特定主题中读取,如下所示:

  • 主题
  • 中的所有消息
  • 所有新消息

为此您可以使用该属性:

props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); 

而不是“最早”的其他选项是:

  • 最早:自动将偏移量重置为最早的偏移量
  • 最新:自动将偏移重置为最新的偏移量
  • none:如果未找到先前的偏移,则向使用者抛出异常 或消费者团体
  • 其他任何事情:向消费者抛出异常。

这是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中。