Kafka包含四种核心的API:
1、Producer API支持应用将数据流发送到Kafka集群的主题
2、Consumer API支持应用从Kafka集群的主题中读取数据流
3、Streams API支持数据流从输入主题转化到输出主题
4、Connect API支持实现持续地从一些源系统或应用划入Kafka或者从Kafka推入一些源系统或应用的接口。
我们这里主要讨论Producer API和Consumer API的使用,由于最新版的kafka java api中使用了一些jdk8的新特性,所以要求我们在本机上jdk版本要在8以上。
一、创建队列
开启kafka
zkServer.sh start
kafka-server-start.sh -daemon /opt/kafka/config/server.properties
创建队列
kafka-topics.sh --zookeeper hadoop001:2181 --create --topic test --partitions 3 --replication-factor 1
二、引入依赖
创建maven项目在pom导入依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
三、Producer的API
public class MyProducer {
public static void main(String[] args) {
Properties prop=new Properties();
prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.184.40:9092");
prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.class);
prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class);
prop.put(ProducerConfig.ACKS_CONFIG,"-1");
KafkaProducer<String,String> producer=new KafkaProducer<>(prop);
for (int i = 0; i < 200; i++) {
ProducerRecord<String,String> producerRecord =
new ProducerRecord<>("test","test"+i);
producer.send(producerRecord);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("消息发送完毕");
}
}
- bootstrap_servers 配置项处需要填写要发送到的Kafka集群地址。
- acks 配置项用来控制producer要求leader确认多少消息后返回调用成功。当值为0时producer不需要等待任何确认消息。当值为1时只需要等待leader确认。当值为-1或all时需要全部ISR集合返回确认才可以返回成功。
- key_serializer 和 value_serializer 指定使用什么序列化方式将用户提供的key和value进行序列化。
四、Consumer的API
public class MyConsumer {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"192.168.184.40:9092");
prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,StringDeserializer.class);
prop.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG,"30000");
prop.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG,"false");
//prop.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,"1000");
//earliest latest none
//auto.offset.reset=latest 情况下,新的消费者将会从其他消费者最后消费的 offset 处开始消费 Topic 下的消息
//auto.offset.reset= earliest 情况下,新的消费者会从该 topic 最早的消息开始消费
//auto.offset.reset=none 情况下,新的消费者加入以后,由于之前不存在 offset,则会直接抛出异常
prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,"earliest");
// prop.put(ConsumerConfig.GROUP_ID_CONFIG,"G1");
// KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
// consumer.subscribe(Collections.singleton("test"));
//一个消费者组G1里只有一个消费者
/*while(true) {
ConsumerRecords<String, String> poll = consumer.poll(100);
for (ConsumerRecord<String, String> record : poll) {
System.out.println(record.offset()+"\t"+record.key()+"\t"+record.value());
}
}*/
//模拟多消费者在同一个分组G2
prop.put(ConsumerConfig.GROUP_ID_CONFIG,"G2");
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
consumer.subscribe(Collections.singleton("test"));
while(true) {
ConsumerRecords<String, String> poll = consumer.poll(100);
for (ConsumerRecord<String, String> record : poll) {
System.out.println(Thread.currentThread().getName()+"\t"+record.offset()+"\t"+record.key()+"\t"+record.value());
}
}
}
}).start();
}
}
}
- bootstrap_servers配置项指定了consumer需要连接的服务器集群。多台服务器用“,”分隔
- key_deserializer和value_deserializer指用什么方式进行反序列化。
- enable_auto_commit指定是否自动提交,false表手动提交。
- auto_commit_interval_ms配置项配置了每次自动提交的时间间隔。
- session_timeout_ms 超时时间设置。
- auto_offset_reset 设置新的消费者开始消费的位置
- auto.offset.reset=latest 情况下,新的消费者将会从其他消费者最后消费的 offset 处开始消费 Topic 下的消息
- auto.offset.reset= earliest 情况下,新的消费者会从该 topic 最早的消息开始消费
- auto.offset.reset=none 情况下,新的消费者加入以后,由于之前不存在 offset,则会直接抛出异常
- group_id 即消费者组标签,本例中消费者组的名称为G1、G2。