在 高级API
中,消费者要从头开始消费某个 topic
的全量数据,需要满足2个条件:
(1)使用一个全新的"group.id"(就是之前没有被任何消费者使用过);
(2)使用assign来订阅;
注意:如果把 "enable.auto.commit" 设为 "false"
,使用 consumer.commitAsync(currentOffsets, null)
手动提交 offset
,是不能从头开始消费的
auto.offset.reset值含义解释
earliest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
latest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
none
topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
也就是说无论哪种设置,只要 kafka
中相同 group
、partition
中已经有提交的 offset
,则都无法从开始消费。
参考论坛:服务器重启了,那么该group是否会重新消费服务器里面所有的消息
KafkaConsumer.subscribe() : 为consumer自动分配partition,有内部算法保证topic-partition以最优的方式均匀分配给同group下的不同consumer。如果有多个partition且只有一个消费者,则按顺序消费所有分区。不会重复消费。
KafkaConsumer.assign() : 为consumer手动、显示的指定需要消费的topic-partitions,不受group.id限制,不提交offset,相当与指定的group无效(this method does not use the consumer's group management)。可以重复消费。
或者,这样做:
目前就 high level API
而言,offset
是存于 Zookeeper
中的,无法存于 HDFS
,而 low level API
的 offset
是由自己去维护的,可以将之存于 HDFS
中。