簡體   English   中英

Apache Kafka 分區未使用 RoundRobin 分區程序均勻分布

[英]Apache Kafka Partitions not evenly Distributed with RoundRobin Partitioner

我將 Kafka Producer 與 RoundRobin 分區程序一起使用到具有 12 個分區的主題。

代碼可以在這里找到https://github.com/apache/kafka/blob/2.8/clients/src/main/java/org/apache/kafka/clients/producer/RoundRobinPartitioner.java

我面臨的問題是這個分區程序讓分區正確發送特定消息(以循環方式)但是在 kafka 生產者代碼中,分區方法在第 931 行和第 956 行被調用兩次(在 if 內新批次的塊)由於某些分區沒有發送給它們的記錄,我無法達到我想要的 12 的並行度。 我試過以下的東西。 我已經使用與循環分區程序相同的邏輯有效地編寫了一個自定義分區程序,唯一的區別是如果在分區程序上調用 newBatch 方法之后調用分區方法,則返回先前返回的分區號。 在不理解為什么 kafka 生產者代碼按照上面指定的方式使用它的情況下,我有點緊張,如果有人可以對它有所了解,我將非常感激。 此外,如果有人有任何建議,我可以通過這些建議確保記錄在每個分區上均勻分布,我也願意接受他們。

Kafka 生產者代碼 - https://github.com/apache/kafka/blob/2.8/clients/src/main/java/org/apache/kafka/clients/producer/KafkaProducer.java

先感謝您。

解決方案

您應該使用DefaultPartitioner而不是RoundRobinPartitioner

DefaultPartitioner.java 的評論說:

默認分區策略:

  • 如果記錄中指定了分區,則使用它
  • 如果未指定分區但存在密鑰,請根據密鑰的 hash 選擇分區
  • 如果不存在分區或密鑰,請選擇在批處理已滿時更改的粘性分區。

    有關粘性分區的詳細信息,請參閱 KIP-480。

  • 不為你的producer record提供指定的partition number或partition key,然后sticky partition會起作用,這大約使你的Kafka partitions上的記錄均勻。 請參閱提示 #2:了解生產者中新的粘性分區器 API

    內部的

    同樣,我想解釋一下為什么 RoundRobinPartitioner 總是不以通常認為的循環方式工作。 RoundRobinPartitioner中的“partition()”只能保證調用partition()方法的次數是循環分配的,不足以保證我們分區上的記錄是均勻的。

    注意KafkaProducer.doSend()partition()的調用比較奇怪(可能連續調用了兩次partition())。

    當分區數為偶數時,此處的細微代碼可能會導致分區分配不均。 假設我們有 4 個分區 (0,1,2,3) 和 8 條記錄。

    record 1 -> 2 **partition()** call(return 0, return 1), finally assigned to partition 1
    record 2 -> 2 **partition()** call(return 2, return 3), finally assigned to partition 3
    record 3 -> 2 **partition()** call(return 0, return 1), finally assigned to partition 1
    record 4 -> 2 **partition()** call(return 2, return 3), finally assigned to partition 3
    record 5 -> 2 **partition()** call(return 0, return 1), finally assigned to partition 1
    ....
    

    看? 記錄只會分配到分區 1 和 3!

    結論

    RoundRobinPartitioner 有一個容易混淆的名字,它提供了調用partition()的 RoundRobin,而不是調用KafkaProducer.send()的 RoundRobin。 為了確保記錄在所有分區中均勻分布,請使用DefaultPartitioner

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM