2.2分区器
默认分区器
ProducerRecord对象包含了目标主题(topic)、键(key)和值(value)。Kafka的消息是一个个键值对,ProducerRecord对象可以只包含目标主题和值,键可以设置为默认的null,不过大多数应用程序会用到键。键有两个用途:可以作为消息的附加信息,也可以用来决定消息该被写到主题的哪个分区。对于默认分区器,拥有相同键的消息将被写到同一个分区。
Kafka的默认分区器是org.apache.kafka.clients.producer.internals.DefaultPartitioner。
默认分区策略
-
在ProducerRecord中指定了分区,直接使用 -- KafkaProducer
-
没有指定分区,key不为空,那么Kafka会对键进行散列(使用Kafka自己的散列算法),然后根据散列值把消息映射到特定分区上 -- DefaultPartitioner
-
没有指定分区,key为null,那么消息将被随机地发送到主题内各个可用的分区上。分区器使用轮询(Round Robin)算法将消息均衡地分布到各个分区上 -- DefaultPartitioner
自定义分区器
可以通过property partitioner.class设置为自定义的分区器。
Properties kafkaProps = new Properties();
kafkaProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
kafkaProps.put(ProducerConfig.PARTITIONER_CLASS_CONFIG, CustomPartitioner.class.getCanonicalName());
kafkaProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
kafkaProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<>(kafkaProps);
上面代码第三行即设置了自定义分区器。
对于自定义分区器需要实现org.apache.kafka.clients.producer.Partitioner接口:
/**
* Partitioner Interface
*/
public interface Partitioner extends Configurable, Closeable {
/**
* Compute the partition for the given record.
*
* @param topic The topic name
* @param key The key to partition on (or null if no key)
* @param keyBytes The serialized key to partition on( or null if no key)
* @param value The value to partition on or null
* @param valueBytes The serialized value to partition on or null
* @param cluster The current cluster metadata
*/
public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
/**
* This is called when partitioner is closed.
*/
public void close();
}

浙公网安备 33010602011771号