2017-05-03 35 views
0

這個解釋在卡夫卡10中仍然有效嗎?當未指定分區鍵時,爲什麼數據在分區間不均勻分佈?

在Kafka生產者中,可以指定一個分區鍵來表示消息的目標分區。默認情況下,基於散列的分區程序用於確定給定密鑰的分區標識,人們也可以使用自定義分區程序。 要減少開放套接字的數量,在0.8.0(https://issues.apache.org/jira/browse/KAFKA-1017)中,當未指定分區鍵或爲空時,製作者將選擇一個隨機分區並在切換到另一個分區之前堅持一段時間(默認爲10分鐘)一。因此,如果生產者數量少於分區數量,那麼在某個特定時間點,某些分區可能不會收到任何數據。爲了緩解這個問題,可以減少元數據刷新間隔,或者指定消息密鑰和定製的隨機分區。欲瞭解更多詳細信息,請參閱此線程http://mail-archives.apache.org/mod_mbox/kafka-dev/201310.mbox/%3CCAFbh0Q0aVh%2Bvqxfy7H-%2BMnRFBt6BnyoZk1LWBoMspwSmTqUKMg%40mail.gmail.com%3E

從這裏https://cwiki.apache.org/confluence/display/KAFKA/FAQ#FAQ-Whyisdatanotevenlydistributedamongpartitionswhenapartitioningkeyisnotspecified

回答

0

新生產者已更改爲使用循環策略。也就是說,如果沒有指定密鑰,消息將均勻地傳送到所有分區。

+0

給定空鍵,我認爲老生產者也使用循環賽策略。它產生一個分區10分鐘,然後切換到另一個分區。因此,在某些情況下,如果生產者的線程數爲1,那麼數據並不是均勻分佈的。比方說,1.新的實現使記錄在所有分區間均勻分佈? – Tong

+0

如果沒有提供密鑰並且緩存中不包含該主題的分區信息,則舊生產者會隨機選擇一個分區,因此很難以循環方式進行操作。請參閱kafka.producer.async.DefaultEventHandler.getPartition方法 – amethystic