如何减少分区Kafka主题的数量?

Ken*_*yen 14 apache-kafka

我在Kafka上创建了一个包含4个分区的主题.(设置默认number.partition = 4)现在我想将此主题的数字分区更改为3.我只是尝试 number.partition=4 但没有变化.它仍然有4个分区.有人知道吗?

ppa*_*rno 19

Apache Kafka不支持减少分区号.您应该将主题视为一个整体,分区是扩展性能的一种方式.因此,发送到主题的所有数据都流向所有分区并删除其中一个分区意味着数据丢失.


Han*_*sen 17

您不能只删除分区,因为这会导致数据丢失,并且剩余数据的密钥也不会正确分发,因此新消息不会被引导到与具有相同密钥的旧现有消息相同的分区.

由于上述原因,Kafka不支持减少现有主题的分区计数.

您可以做的是创建一个包含3个分区的新主题,然后编写一个小程序(或使用现有的复制工具)将数据从旧的4分区主题复制到新的3分区主题.这样,您将通过同一个分区程序运行所有内容,并且所有键控消息将最终出现在正确的分区中.一旦您满意,数据全部被复制,然后删除原始的4分区主题.

如果必须保留与原始主题相同的主题名称,则只需使用原始名称创建新主题,从重新分区的主题中复制数据,然后删除该临时重新分区主题.

  • 另一种选择是从 4 个分区增加到 6 个分区,然后您的 3 个消费者每个只会获得 2 个分区,并且仍然保持平衡。但是,您将丢失跨分区的消息排序。 (3认同)

小智 8

我不买以上所有答案。“删除分区导致数据丢失”是一个模糊的答案。减少分区数在分布式系统中并不是什么新鲜事,事实上很多系统都支持它。如果你能负担得起在保持数据一致性的同时重新平衡整个存储系统的开销,那么减少分区并不是不可能的事情。

在我看来,Kafka 不支持减少分区数的真正原因是由于 Kafka 的一个重要属性:Kafka 保证每个分区内消息的顺序,但不保证分区之间消息的顺序(但它是可能的)。在许多用例中,此排序属性至关重要。在删除其中一个分区的原因中,在保留顺序的同时将被删除分区中的消息重新分发到其他分区是不可能的,因为无法保证分区之间的排序。无论您如何分布已删除分区中的数据,您都将破坏您分布到的任何分区的顺序保证属性。如果 Kafka 不关心每个分区内的消息顺序,那么可以很容易地支持减少分区号。

  • 那为什么支持增加分区呢?增加它们也会导致重新分配 (3认同)
  • +1 `Kafka 保证每个分区内消息的顺序,但不保证分区之间消息的顺序(但这是可能的)。` (2认同)

ame*_*tic 5

不支持减少分区数。