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();

}

猜你喜欢

转载自www.cnblogs.com/pugongying017/p/9616163.html