kafka写入分区策略

客户端可以控制将消息发送到哪个分区

Kafka默认分区机制(org.apache.kafka.clients.producer.internals.DefaultPartitioner):

如果记录中指定了分区,则直接使用

如果未指定分区,但指定了key值,则根据key的hash值选择一个分区(相同的key所发送到的Partition是同一个,可用来保证消息的局部有序性)

如果未指定分区,也未指定key值,则以 '黏性分区' 策略(2.4版本以前使用轮询策略)选择一个分区

分区策略

轮询策略(org.apache.kafka.clients.producer.RoundRobinPartitioner)

如果key值为null,并且使用了默认的分区器,Kafka会根据轮训(Random Robin)策略将消息均匀地分布到各个分区上。

散列策略(Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions)

如果键值不为null,并且使用了默认的分区器,Kafka会对键进行散列,然后根据散列值把消息映射到对应的分区上

黏性分区策略(org.apache.kafka.clients.producer.UniformStickyPartitioner)

很多时候消息是没有指定Key的。而Kafka 2.4之前的策略是轮询策略,这种策略在使用中性能比较低。所以2.4中版本加入了黏性分区策略(Sticky Partitioning Strategy)。

黏性分区器(Sticky Partitioner)主要思路是选择单个分区发送所有无Key的消息。一旦这个分区的batch已满或处于“已完成”状态,黏性分区器会随机地选择另一个分区并会尽可能地坚持使用该分区——象黏住这个分区一样

自定义策略

默认分区器是使用次数最多的分区器。除了散列分区之外,用户可以根据需要对数据使用不一样的分区策略

实现org.apache.kafka.clients.producer.Partitioner接口,在配置中设置实现的类prop.put("partitioner.class", 实现类);
标签: 分区、黏性、kafka、clients、未指定、面试
  • k6k4

    寂寞纠缠
    2021-04-12 21:43:56 1楼#1层
    1. 指定了key,按照key进行哈希,相同key去一个partition。
    2. 没有指定key,round-robin来选partition
  • 回复
隐藏