一、准备工作
- 在IDE上创建maven项目,pom文件添加依赖
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.1.1</version>
</dependency>
- 启动zookeeper集群
bin/zkServer.sh start
- 启动kafka集群
bin/kafka-server-start.sh -daemon config/server.properties
- kafka集群开一个生产者
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mydata
二、创建一个普通的消费者(自动提交 offset)
Consumer 消费数据时的可靠性是很容易保证的,因为数据在 Kafka 中是持久化的,故不用担心数据丢失问题。
由于 consumer 在消费过程中可能会出现断电宕机等故障,consumer 恢复后,需要从故障前的位置的继续消费,所以 consumer 需要实时记录自己消费到了哪个 offset,以便故障恢复后继续消费。所以 offset 的维护是 Consumer 消费数据是必须考虑的问题
下方代码,这种消费只会记录最大的offset,相当于在命令行不加 --from-beginning,以前的数据消费不到
import java.util.Collections;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class MyConsumer {
public static void main(String[] args) {
Properties properties = new Properties();
/* 指定连接kafka集群 */
properties.put("bootstrap.servers", "centos7-1:9092");
/* 开启自动提交 */
properties.put("enable.auto.commit", Boolean.valueOf(true));
/* 自动提交的延时时间 */
properties.put("auto.commit.interval.ms", "1000");
/* key的反序列化 */
properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
/* value的反序列化 */
properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
/* 指定消费者组 */
properties.put("group.id", "mygroup");
/* 创建消费者对象 */
KafkaConsumer<String, String> consumer = new KafkaConsumer(properties);
/* 订阅的主题,可同时订阅多个 */
consumer.subscribe(Collections.singletonList("bigdata"));
while (true) {
/* 获取数据,设置拉取数据延迟时间 */
ConsumerRecords<String, String> consumerRecords = consumer.poll(100);
for (ConsumerRecord<String, String> consumerRecord : consumerRecords)
{
/* 打印消息的键和值 */
System.out.println(consumerRecord.key() + "==>" + consumerRecord.value());
}
}
}
}
运行截图:
三、那么如何重新消费某一个主题的数据(自动提交 offset)
可以换一个消费者组,并且重置offset
/* 指定消费者组 */
properties.put("group.id",