文章目录
Kafka版本
- kafka版本1.1.1,可能绝大部分也适用于kafka 0.10.x及以上版本。
修改offset(偏移量)
- 在使用
consumer
消费的时候,每个topic会产生一个offset(偏移量)
,offset(偏移量)
是在kafka
服务端__consumer__offsets
这个Topic
下存储的,我们修改这个offset(偏移量)
到我们想重新消费的位置即可以重新消费,standalone consumer(指consumer.assign()而非consumer.subscribe()的消费者)
每次都从最开始的地方消费所有数据,因为是独立的consumer
而非consumerGruop
,所以集群环境下,启动多个,会导致每个consumer
实例都会从最开始的地方(重新消费的offset
)消费所有数据,每个consumer
实例消费的数据都一样
准备数据
-
第一步:创建topic
bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replicatoin-factor 3 --partitions 5 --topic testTopic
-
第二步:生产数据
@Test public void testProducer() { Properties producerProps = new Properties(); producerProps.put("bootstrap.servers", "kafka-master:9092,kafka-slave1:9093,kafka-slave2:9094"); producerProps.put("client.id", "DemoProducer"); producerProps.put("key.serializer", StringSerializer.class.getName()); producerProps.put("value.serializer", StringSerializer.class.getName()); KafkaProducer<Integer, String> producer = new KafkaProducer<>(producerProps); String key = "test1"; String topic = "testTopic"; //同一个key的消息放到同一个分区,不指定key则均衡分布,消息分区的选择是在客户端进行的 for (int i = 0; i < 100; i++) { try { String messageStr = "hello world " + i; ProducerRecord producerRecord = new ProducerRecord(topic, key, messageStr); Future<RecordMetadata> future = producer.send(producerRecord); List<PartitionInfo> partitionInfos = producer.partitionsFor(topic); for (PartitionInfo partitionInfo : partitionInfos) { System.out.println(partitionInfo); } RecordMetadata recordMetadata = future.get(); System.out.println(ToStringBuilder.reflectionToString(recordMetadata)); } catch (Exception e) { logger.error(e.getMessage(), e); } } }
-
第三步:消费数据
@Test public void testConsumer() { Properties props = new Properties(); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-master:9092,kafka-slave1:9093,kafka-slave2:9094"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "testgroup"); props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false"); props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000")