[英]Reading already partitioning topic in Kafka Streams DSL
在 Kafka Streams 中對大容量主題進行重新分區可能非常昂貴。 一種解決方案是通過生產者側的鍵對主題進行分區,並在 Streams 應用程序中攝取已經分區的主題。
有沒有辦法告訴 Kafka Streams DSL 我的源主題已經被給定的鍵分區並且不需要重新分區?
讓我澄清一下我的問題。 假設我有一個這樣的簡單聚合(為簡潔起見,省略了詳細信息):
builder
.stream("messages")
.groupBy((key, msg) -> msg.field)
.count();
鑒於此代碼,Kafka Streams 將讀取messages
主題並立即將消息寫回內部重新分區主題,這次由msg.field
作為鍵進行分區。
使這種往返變得不必要的一種簡單方法是首先編寫由msg.field
分區的原始messages
主題。 但是 Kafka Streams 對messages
主題分區一無所知,我發現無法告訴它主題是如何分區的,而不會導致真正的重新分區。
請注意,我並不是要完全消除分區步驟,因為必須對主題進行分區才能計算鍵控聚合。 我只想將分區步驟從 Kafka Streams 應用程序上游轉移到原始主題生產者。
我正在尋找的基本上是這樣的:
builder
.stream("messages")
.assumeGroupedBy((key, msg) -> msg.field)
.count();
其中,assetGroupedBy 會將assumeGroupedBy
標記為已被msg.field
分區。 我知道這個解決方案有點脆弱,並且會在分區鍵不匹配時中斷,但它解決了處理大量數據時的問題之一。
更新問題后更新:如果您的數據已經根據需要進行了分區,並且您只想聚合數據而不需要重新分區操作(兩者都適用於您的用例),那么您只需要使用groupByKey()
而不是groupBy()
。 雖然groupBy()
總是導致重新分區,但它的兄弟groupByKey()
假設輸入數據已經根據現有消息鍵的需要進行了分區。 在您的示例中,如果key == msg.field
, groupByKey()
將起作用。
原答案如下:
在 Kafka Streams 中對大容量主題進行重新分區可能非常昂貴。
是的,沒錯——它可能非常昂貴(例如,當高容量意味着每秒數百萬個事件時)。
有沒有辦法告訴 Kafka Streams DSL 我的源主題已經被給定的鍵分區並且不需要重新分區?
除非您指示,否則 Kafka Streams 不會重新分區數據; 例如,使用KStream#groupBy()
function。 因此,無需像您在問題中所說的那樣告訴它“不要分區”。
一種解決方案是通過生產者側的鍵對主題進行分區,並在 Streams 應用程序中攝取已經分區的主題。
鑒於您的這種解決方法,我的印象是您提出問題的動機是其他的(您必須考慮到特定的情況),但是您的問題文本並沒有明確說明可能是什么。 也許您需要用更多細節更新您的問題?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.