pom
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
以下kafka集群的节点分别是node01,node02,node03
1、在kafka集群中创建student主题 副本为2个,分区为3个
生产者设置:
设置key的序列化为 org.apache.kafka.common.serialization. StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
其他都是默认设置
消费者设置:
消费者组id为test
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
其他都是默认设置
模拟生产者,请写出代码向student主题中生产数据0-99
模拟消费者,请写出代码把student主题中的数据0-99消费掉,打印输出到控制台
Priducer 代码
package Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/19. 1
*
* 在kafka集群中创建student主题 副本为2个,分区为3个
生产者设置:
设置key的序列化为 org.apache.kafka.common.serialization. StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
其他都是默认设置
消费者设置:
消费者组id为test
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
其他都是默认设置
模拟生产者,请写出代码向student主题中生产数据0-99
模拟消费者,请写出代码把student主题中的数据0-99消费掉,打印输出到控制台
*/
public class Priducer_01 {
public static void main(String[] args) {
//编写 生产数据程序
Properties props = new Properties();
props.put("bootstrap.servers", "node001:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("batch.size", 16384);
props.put("linger.ms", 1);
props.put("buffer.memory", 33554432);
props.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
//2. 实例一个 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 100; i++) {
//3. 模拟生产者,请写出代码向student主题中生产数据0-99
ProducerRecord producerRecord = new ProducerRecord("student"," "+i);
kafkaProducer.send(producerRecord);
}
}
}
Consumer 代码
package Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/19. 1
*
* 在kafka集群中创建student主题 副本为2个,分区为3个
生产者设置:
设置key的序列化为 org.apache.kafka.common.serialization. StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
其他都是默认设置
消费者设置:
消费者组id为test
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
其他都是默认设置
模拟生产者,请写出代码向student主题中生产数据0-99
模拟消费者,请写出代码把student主题中的数据0-99消费掉,打印输出到控制台
*/
public class Consumer_01 {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "node001:9092,node002:9092,node003:9092");
props.put("group.id", "test");
//以下两行代码 ---消费者自动提交offset值
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// 设置 消费者 对象
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
// 设置读取的 topic
kafkaConsumer.subscribe(Arrays.asList("student"));
// 模拟消费者,请写出代码把student主题中的数据0-99消费掉,打印输出到控制台 循环遍历
while (true){
//拉取数据 并 输出
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(1000);
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//一条数据
System.out.println("数据为: "+consumerRecord.value() );
}
}
}
}
2、在kafka集群中创建teacher主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为2
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为默认轮询方式
消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
auto.offset.reset
//earliest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费 //latest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据 //none : topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常 |
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟生产者,请写出代码向teacher主题中生产数据bigdata0-bigdata99
模拟消费者,请写出代码把teacher主题中的数据bigdata0-bigdata99消费掉 ,打印输出到控制台
Priducer代码
package Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20. 2
*
* 在kafka集群中创建teacher主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为 all
重试次数 为 2
批量处理消息字节数 为 16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟 1 ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为默认轮询方式
模拟生产者,请写出代码向teacher主题中生产数据 bigdata0 - bigdata99
*/
public class Priducer_02 {
public static void main(String[] args) {
//编写 生产数据程序
//1、配置kafka集群环境(设置)
Properties props = new Properties();
//kafka服务器地址
props.put("bootstrap.servers", "node001:9092");
//消息确认机制
props.put("acks", "all");
//重试机制
props.put("retries", 2);
//批量发送的大小
props.put("batch.size", 16384);
//消息延迟
props.put("linger.ms", 1);
//批量的缓冲区大小
props.put("buffer.memory", 33554432);
// kafka key 和value的序列化
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
//2. 实例一个 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 100; i++) {
//3. 模拟生产者,请写出代码向teacher主题中生产数据bigdata0-bigdata99 数据分发策略为默认轮询方式
ProducerRecord producerRecord = new ProducerRecord("teacher","bigdata"+i);
kafkaProducer.send(producerRecord);
}
}
}
Consumer 代码
package Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20. 2
* 2、消费者设置:
消费者组 id 为 test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
*
*
* auto.offset.reset
//earliest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
//latest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
//none : topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟消费者,请写出代码把 teacher 主题中的数据 bigdata0 - bigdata99 消费掉 ,打印输出到控制台
*
*/
public class Consumer_02 {
public static void main(String[] args) {
//1、添加哦配置文件
Properties props = new Properties();
//指定kafka服务器
props.put("bootstrap.servers", "node001:9092,node002:9092,node003:9092");
//消费组
props.put("group.id", "test");
//以下两行代码 ---消费者自动提交offset值
props.put("enable.auto.commit", "true");
//自动提交的周期
props.put("auto.commit.interval.ms", "1000");
// 设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
props.put("auto.offset.earliest","true");
//kafka key 和value的反序列化
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//2、实例消费者对象
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
//3、设置读取的topic
kafkaConsumer.subscribe(Arrays.asList("teacher"));
//循环遍历
while (true){
//4、拉取数据,并输出
//获取到所有的数据
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(1000);
//遍历所有数据,获得到一条
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//一条数据
System.out.println("数据是 "+consumerRecord.value());
}
}
}
}
3、在kafka集群中创建title主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为1
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为指定数据key为title,分发到同一个分区中
消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟生产者,请写出代码向title主题中生产数据kafka0-kafka99
模拟消费者,请写出代码把title主题中的数据kafka0-kafka99消费掉 ,打印输出到控制台
Priducer 代码
package Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
*
*在kafka集群中创建title主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为 all
重试次数 为 1
批量处理消息字节数 为 16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟 1 ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为指定数据 key为 title ,分发到同一个分区中
模拟生产者,请写出代码向title主题中生产数据 kafka0 - kafka99
*/
public class Priducer_03 {
public static void main(String[] args) {
//编写 生产数据程序
//1、配置kafka集群环境(设置)
Properties props = new Properties();
//kafka服务器地址
props.put("bootstrap.servers", "node001:9092");
//消息确认机制
props.put("acks", "all");
//重试机制
props.put("retries", 1);
//批量发送的大小
props.put("batch.size", 16384);
//消息延迟
props.put("linger.ms", 1);
//批量的缓冲区大小
props.put("buffer.memory", 33554432);
// kafka key 和value的序列化
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
//2. 实例一个 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 100; i++) {
//3. 模拟生产者,请写出代码向teacher主题中生产数据bigdata0-bigdata99 数据分发策略为默认轮询方式
ProducerRecord producerRecord = new ProducerRecord("order","title","kafka"+i);
kafkaProducer.send(producerRecord);
}
}
}
Consumer 代码
package Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
* 消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟消费者,请写出代码把 title 主题中的数据 kafka0 - kafka99 消费掉 ,打印输出到控制台
*/
public class Consumer_03 {
public static void main(String[] args) {
//1、添加哦配置文件
Properties props = new Properties();
//指定kafka服务器
props.put("bootstrap.servers", "node001:9092,node002:9092,node003:9092");
//消费组
props.put("group.id", "test");
//以下两行代码 ---消费者自动提交offset值
props.put("enable.auto.commit", "true");
//自动提交的周期
props.put("auto.commit.interval.ms", "1000");
// 设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
props.put("auto.offset.latest","true");
//kafka key 和value的反序列化
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//2、实例消费者对象
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
//3、设置读取的topic
kafkaConsumer.subscribe(Arrays.asList("title"));
//循环遍历
while (true){
//4、拉取数据,并输出
//获取到所有的数据
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(1000);
//遍历所有数据,获得到一条
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//一条数据
System.out.println("数据是 "+consumerRecord.value());
}
}
}
}
4、在kafka集群中创建title主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为2
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为指定分区2,把数据发送到指定的分区中
消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟生产者,请写出代码向title主题中生产数据test0-test99
模拟消费者,请写出代码把title主题中的数据test0-test99消费掉 ,打印输出到控制台
Priducer 代码
package Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
*
* 在kafka集群中创建title主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为2
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为指定分区2,把数据发送到指定的分区中
模拟生产者,请写出代码向 title 主题中生产数据test0-test99
*/
public class Priducer_04 {
public static void main(String[] args) {
//编写 生产数据程序
//1、配置kafka集群环境(设置)
Properties props = new Properties();
//kafka服务器地址
props.put("bootstrap.servers", "node001:9092");
//消息确认机制
props.put("acks", "all");
//重试机制
props.put("retries", 2);
//批量发送的大小
props.put("batch.size", 16384);
//消息延迟
props.put("linger.ms", 1);
//批量的缓冲区大小
props.put("buffer.memory", 33554432);
// kafka key 和value的序列化
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
//2. 实例一个 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 100; i++) {
//3. 模拟生产者,请写出代码向teacher主题中生产数据bigdata0-bigdata99 数据分发策略为默认轮询方式
ProducerRecord producerRecord = new ProducerRecord("title",2,"","test"+i);
kafkaProducer.send(producerRecord);
}
}
}
Consumer 代码
package Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
* 消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置 topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟消费者,请写出代码把title主题中的数据 test0 -test99消费掉 ,打印输出到控制台
*/
public class Consumer_04 {
public static void main(String[] args) {
//1、添加哦配置文件
Properties props = new Properties();
//指定kafka服务器
props.put("bootstrap.servers", "node001:9092,node002:9092,node003:9092");
//消费组
props.put("group.id", "test");
//以下两行代码 ---消费者自动提交offset值
props.put("enable.auto.commit", "true");
//自动提交的周期
props.put("auto.commit.interval.ms", "1000");
// 设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
props.put("auto.offset.none","true");
//kafka key 和value的反序列化
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//2、实例消费者对象
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
//3、设置读取的topic
kafkaConsumer.subscribe(Arrays.asList("title"));
//循环遍历
while (true){
//4、拉取数据,并输出
//获取到所有的数据
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(1000);
//遍历所有数据,获得到一条
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//一条数据
System.out.println("数据是 "+consumerRecord.value());
}
}
}
}
5、在kafka集群中创建order主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为1
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为自定义,请把生产的数据100以内的数据分发到分区0中,100-200以内的数据分发到分区1中,200-300内的数据分发到分区2中
消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟生产者,请写出代码向title主题中生产数据0-299
模拟消费者,请写出代码把title主题中的数据0-299消费掉 ,打印输出到控制台
Priducer 代码
package Producer;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
*
在kafka集群中创建order主题 副本为2个,分区为3个
生产者设置:
消息确认机制 为all
重试次数 为1
批量处理消息字节数 为16384
设置缓冲区大小 为 33554432
设置每条数据生产延迟1ms
设置key的序列化为org.apache.kafka.common.serialization.StringSerializer
设置value的序列化为org.apache.kafka.common.serialization.StringSerializer
数据分发策略为自定义,请把生产的数据100以内的数据分发到分区0中,100-200以内的数据分发到分区1中,200-300内的数据分发到分区2中
模拟生产者,请写出代码向order主题中生产数据0-299
*/
public class Priducer_05 {
public static void main(String[] args) {
//编写 生产数据程序
//1、配置kafka集群环境(设置)
Properties props = new Properties();
//kafka服务器地址
props.put("bootstrap.servers", "node001:9092");
//消息确认机制
props.put("acks", "all");
//重试机制
props.put("retries", 1);
//批量发送的大小
props.put("batch.size", 16384);
//消息延迟
props.put("linger.ms", 1);
//批量的缓冲区大小
props.put("buffer.memory", 33554432);
// kafka key 和value的序列化
props.put("key.serializer","org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer","org.apache.kafka.common.serialization.StringSerializer");
//自定义分区
props.put("partitioner.class", "Producer.Priducer_05_Partitione");
//2. 实例一个 生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
for (int i = 0; i < 300; i++) {
//3. 模拟生产者,请写出代码向teacher主题中生产数据bigdata0-bigdata99 数据分发策略为默认轮询方式
ProducerRecord producerRecord = new ProducerRecord("order",""+i);
kafkaProducer.send(producerRecord);
}
}
}
Partitioner 代码
package Producer;
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import java.util.Map;
/**
* Created by 一个蔡狗 on 2020/3/20.
*/
public class Priducer_05_Partitione implements Partitioner {
@Override
public int partition(String s, Object o, byte[] bytes, Object o1, byte[] bytes1, Cluster cluster) {
/*
编写自定义分区代码
数据分发策略为自定义,请把生产的数据100以内的数据分发到分区0中,100-200以内的数据分发到分区1中,200-300内的数据分发到分区2中
*/
//将 value 转为 Integer 在进行 int 判断
String s1 = o1.toString();
Integer number =Integer.getInteger(s1);
if (number<100){
return 0;
}else if (number<200 & number>= 100){
return 1;
}else if (number<300 & number>= 200){
return 2;
}else {
return 0;
}
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> map) {
}
}
Consumer 代码
package Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.util.Arrays;
import java.util.Properties;
/**
* Created by 一个蔡狗 on 2020/3/20.
*
*
*
* 消费者设置:
消费者组id为test
设置自动提交偏移量
设置自动提交偏移量的时间间隔
设置当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
设置key的序列化为org.apache.kafka.common.serialization. StringDeserializer
设置value的序列化为org.apache.kafka.common.serialization. StringDeserializer
模拟消费者,请写出代码把order主题中的数据 0-299 消费掉 ,打印输出到控制台
*/
public class Consumer_05 {
public static void main(String[] args) {
//1、添加哦配置文件
Properties props = new Properties();
//指定kafka服务器
props.put("bootstrap.servers", "node001:9092,node002:9092,node003:9092");
//消费组
props.put("group.id", "test");
//以下两行代码 ---消费者自动提交offset值
props.put("enable.auto.commit", "true");
//自动提交的周期
props.put("auto.commit.interval.ms", "1000");
// 设置 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
props.put("auto.offset.earliest","true");
//kafka key 和value的反序列化
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
//2、实例消费者对象
KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(props);
//3、设置读取的topic
kafkaConsumer.subscribe(Arrays.asList("order"));
//循环遍历
while (true){
//4、拉取数据,并输出
//获取到所有的数据
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(1000);
//遍历所有数据,获得到一条
for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
//一条数据
System.out.println("数据是 "+consumerRecord.value());
}
}
}
}
// Knowledge
* auto.offset.reset
//earliest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
//latest: 当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
//none : topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
props.put("auto.offset.reset","earliest");
props.put("auto.offset.reset","latest");
props.put("auto.offset.reset","none");