自定义分区器代码:
1) 默认的分区器 DefaultPartitioner
2) 自定义分区器
java代码
自定义分区器 需要实现Kafka提供的partitioner接口
/**
* 计算分区号以first主题为例, 有两个分区. 包含itwise的消息发送0号分区
* 其他消息发送1号分区
* @param topic 当前消息发往的主题* @param key 当前消息的key
* @param keyBytes 当前消息的key序列化后字节数组
* @param value 当前消息的值
* @param valueBytes 当前消息的值序列化后的字节数组
* @param cluster
* @return
使用自定义的分区器:MyPartitioner
package com.itwise.kafka.partitioner;
import org.apache.kafka.clients.producer.Partitioner;
import org.apache.kafka.common.Cluster;
import java.util.Map;
public class MyPartitioner implements Partitioner {
/**
* 计算分区号
* 以first主题为例, 有两个分区.
* 包含itwise的消息发送0号分区
* 其他消息发送1号分区
* @param topic 当前消息发往的主题
* @param key 当前消息的key
* @param keyBytes 当前消息的key序列化后字节数组
* @param value 当前消息的值
* @param valueBytes 当前消息的值序列化后的字节数组
* @param cluster
* @return
*/
@Override
public int partition(String topic, Object key, byte[] keyBytes, Object
value, byte[] valueBytes, Cluster cluster) {
if(value.toString().contains("itwise")){
return 0 ;
}else{
return 1 ;
}
}
@Override
public void close() {
}
@Override
public void configure(Map<String, ?> map) {
}
}
MyPartitionerProducerDemo
package com.itwise.kafka.partitioner;
import org.apache.kafka.clients.producer.*;
import java.util.Properties;
import java.util.UUID;
public class MyPartitionerProducerDemo {
public static void main(String[] args) {
// 0. 创建配置对象
Properties props= new Properties();
// kafka集群,broker-list
props.put("bootstrap.servers", "node2:9092");
// ack的级别
props.put("acks", "all");
//重试次数
props.put("retries", 3);
// 批次大小
props.put("batch.size", 16384);
// 等待时间
props.put("linger.ms", 1);
// RecordAccumulator缓冲区大小
props.put("buffer.memory", 33554432); //32M
// kv的序列化器
props.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
// 设置分区类
props.put(ProducerConfig.PARTITIONER_CLASS_CONFIG,"com.itwise.kafka.partitioner.MyPartitioner");
// 1. 创建生产者对象
KafkaProducer<String, String> kafkaProducer = new KafkaProducer<String, String>(props);
// 2. 生产数据,leader选举
for (int i = 0; i < 10; i++) {
String value = "" ;
if(i % 2 == 0){
value = "itwise==>" + i ;
}else{
value = UUID.randomUUID().toString() + "==>" + i ;
}
kafkaProducer.send(
new ProducerRecord<String, String>("itwise", value)
, new Callback() {
/**
* 当消息发送完成后, 会调用该方法
* @param metadata 消息的元数据信息.
*
* @param exception 当消息发送过程中,如果抛出异常,会传入到该方
法.
*/
@Override
public void onCompletion(RecordMetadata metadata,
Exception exception) {
if(exception != null){
System.out.println("消息发送失败: " +
exception.getMessage());
}else{
System.out.println("消息发送成功: " +
metadata.topic() +
" : " + metadata.partition() +
" : " + metadata.offset()
);
}
}
});
}
// 3. 关闭对象
kafkaProducer.close();
}
}
启动消费者
[itwise@node4 kafka_2.11-2.4.1]$ kafka-console-consumer.sh --consumer.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise
[itwise@node2 ~]$ kafka-console-consumer.sh --consumer.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise
测试运行

r.config /opt/module/kafka_2.11-2.4.1/config/consumer.properties --bootstrap-server node2:9092 --topic itwise
测试运行
[外链图片转存中...(img-crpte1c3-1712839810286)]
1609

被折叠的 条评论
为什么被折叠?



