一、直接填写分区号
快捷键ctrl+p 可查看参数列表 partition 表示分区
二、不填写分区号,填写key 按照key的hash值来进行分区
三、只填写value 根据自身粘性机制
(先向一个批次中写数据,达到了一批了统一发送 之后切换一个分区 在写一个批次)
粘性机制:
和下面两个参数有关 满足下方其中一个条件即可
1. 批次大小默认16K * properties.put("batch.size",16384);
2.等待时间 默认0ms * properties.put("linger.ms",1);
public class PartitionWithCallBack {
public static void main(String[] args) throws InterruptedException {
//1 创建配置对象
Properties properties = new Properties();
//2给配置对象添加参数
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092");
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
//非必要参数
//批次大小默认16K
properties.put("batch.size",16384);
//等待时间 默认0ms
properties.put("linger.ms",1);
//RecordAccumulator 缓冲区大小 默认32M
properties.put("buffer.memory",33554432);
//3创建kafka生产者对象
//泛型指的是最终发送消息的key可value的类型
KafkaProducer<String, String> Producer = new KafkaProducer<String, String>(properties);
//4 调用send方法发送消息
for (int i = 0; i < 10; i++) {
//添加回调函数
//控制消息发送到不同的分区 由消息的参数决定
//1 直接填写分区号
Producer.send(new ProducerRecord<>("first","", "atguigu" + i), new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception!=null){
exception.printStackTrace();
}else {
System.out.println(metadata.topic()+":"+metadata.partition()+":"+metadata.offset());
}
}
});
//让它睡眠2ms 使它满足设置的等待时间 会进行数据的分区
//数据不是发送的时候打印的而是返回ack的时候打印的 所以一个分区里面的数据可能会相邻
//Thread.sleep(2);
}
//5 关闭连接
//
Producer.close();
}
}
以上是本人通过自学的总结,如果对你有帮助的话,可以点个赞哟