簡體   English   中英

為什么 kafka 流線程在源主題分區更改時死亡? 任何人都可以指出閱讀材料嗎?

[英]Why does kafka streams threads die when the source topic partitions changes ? Can anyone point to reading material around this?

由於消息的吞吐量很高,我們增加了分區的數量以並行處理消息。 一旦我們增加了分區的數量,訂閱該主題的所有流線程就會死亡。 我們更改了消費者組 ID,然后我們重新啟動了它運行良好的應用程序。

我知道應用程序的分區更改日志主題的數量應該與源主題相同。 我想知道這背后的原因。

我看到了這個鏈接 - https://issues.apache.org/jira/browse/KAFKA-6063?jql=project%20%3D%20KAFKA%20AND%20component%20%3D%20streams%20AND%20text%20~% 20%22分區%22

找不到原因

https://github.com/apache/kafka/blob/fdc742b1ade420682911b3e336ae04827639cc04/streams/src/main/java/org/apache/kafka/streams/processor/internals/InternalTopicManager.java#L122

基本上,這背后的原因 if 條件。

輸入主題分區定義並行級別,如果您有有狀態的操作,如聚合或連接,則這些操作在分片中的狀態。 如果您有 X 個輸入主題分區,您將獲得 X 個任務,每個任務都有一個狀態分片。 此外,狀態由具有 X 個分區的 Kafka 中的更改日志主題支持,並且每個分片都使用這些分區中的一個。

如果將輸入主題分區的數量更改為 X+1,Kafka Streams 會嘗試使用 X 個存儲分片創建 X+1 個任務,但是現有的更改日志主題只有 X 個分區。 因此,應用程序的整個分區會中斷,並且 Kafka Streams 無法保證正確處理,因此會因錯誤而關閉。

另請注意,Kafka Streams 假設輸入數據按鍵進行分區。 如果您更改輸入主題分區的數量,基於哈希的分區也會更改可能導致錯誤輸出的內容。

一般來說,建議在開始時對主題進行過度分區以避免此問題。 如果確實需要橫向擴展,最好使用新的分區數創建一個新主題,並並行啟動應用程序的副本(具有新的應用程序 ID)。 之后,您更新上游生產者應用程序以寫入新主題,最后關閉舊應用程序。

如果有狀態客戶端因此而失敗,則刪除更改日志主題和本地狀態存儲。

暫無
暫無

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

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