簡體   English   中英

在 Kafka Streams DSL 中讀取已經分區的主題

[英]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.fieldgroupByKey()將起作用。

原答案如下:

在 Kafka Streams 中對大容量主題進行重新分區可能非常昂貴。

是的,沒錯——它可能非常昂貴(例如,當高容量意味着每秒數百萬個事件時)。

有沒有辦法告訴 Kafka Streams DSL 我的源主題已經被給定的鍵分區並且不需要重新分區?

除非您指示,否則 Kafka Streams 不會重新分區數據; 例如,使用KStream#groupBy() function。 因此,無需像您在問題中所說的那樣告訴它“不要分區”。

一種解決方案是通過生產者側的鍵對主題進行分區,並在 Streams 應用程序中攝取已經分區的主題。

鑒於您的這種解決方法,我的印象是您提出問題的動機是其他的(您必須考慮到特定的情況),但是您的問題文本並沒有明確說明可能是什么。 也許您需要用更多細節更新您的問題?

暫無
暫無

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

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