2015-07-12 99 views
2

我想擁有10個分區的1個主題。我正在使用Kafka的默認配置。我用這個助手腳本創建了10個分區的主題,現在我正在爲它生成消息。卡夫卡沒有在主題中均勻地填充分區

的事情是,它好像有隻有5從中獲取消費者數據分區。

讓我們更詳細地描述它。

我知道常用的東西,你需要每個分區的一個消費者線程。我希望能夠提交每個分區的偏移量,並且只有當每個分區的每個使用者連接器有一個線程時(我正在使用高級使用者)纔有可能。

所以我創建10個線程,每個線程我打電話Consumer.createJavaConsumerConnector(),其中我這樣做

topicCountMap.put("mytopic", 1); 

,並在最後,我有1次迭代從1個分區使用消息。

當我這樣做了10次時,我有10個消費者,每個分區的每個線程的消費者,我可以在每個分區獨立提交補償,因爲如果我在主題地圖中將1從不同的數字中提取出來,所以如果我正在爲創建的消費者實例提交偏移量,它會針對所有不希望的線程提交它們,因此對於不需要的多個分區。

但問題是,當我使用的消費者中,只有5的消費者參與,似乎其他線程處於空閒狀態,但我不知道爲什麼。

第一個可能的原因是,即使我有10個分區,只有5個分區有消息,所以其他5個消費者空閒,但我不明白當我使用的消息在所有分區間均勻分佈時生產者。我發送的郵件數量爲1M,所以如果表示它們均勻分佈,每個必須至少有至少包含一些消息。

//編輯

我設法創建一個話題在10個分區,但我只有7的消費者。這對我來說只是一個奇蹟。

的事情是,我創造了一個循環,這些消費者線程。所以我開始第一個線程(提交給執行者服務),然後是另一個,然後另一個,等等。

所以情況是,首先消費者得到所有10個分區,那麼第二所連接,因此這兩個5和5(或類似的東西),然後其他線程連接之間的分裂。

我理解這是所有消費者之間的分區重新平衡,因此它在這種意義上表現良好,即如果創建更多的消費者,則在這些消費者之間發生分區平衡,因此每個消費者都應該有一些分區進行操作。

但從結果我看到只有7消費者,並根據消費的消息,似乎他們是分裂像3,2,1,1,1,1,1智能分區。是的,這7位消費者覆蓋了全部10個分區,但爲什麼擁有1個以上分區的消費者不會分裂併爲其餘3位消費者提供分區?

我非常想知道什麼是與其餘3個線程發生的事情,爲什麼他們不「搶」分區消費者具有更多的則1個分區分配。

回答

0

我在通過管理腳本創建主題之前(意外)以編程方式訪問主題時看到了類似的行爲。在這種情況下,分區數量以及其他主題配置設置默認爲broker.config中的值。

+0

通過編程訪問它意味着什麼? – stewenson

+0

這是當你在java代碼中調用生產者或消費者時 –