簡體   English   中英

Kafka Streams - 是否可以減少多個聚合創建的內部主題的數量

[英]Kafka Streams - is it possible to reduce the number of internal topics created by multiple aggregations

我有一個Kafka Streams應用程序,它按幾個值對傳入的消息進行分組。 例如:

示例消息:

{ "gender": "female", "location": "canada", "age-group": "25-30" }

拓撲結構:

table
    .groupBy((key, value) -> groupByGender) // example key: female
    .count("gender-counts");

table
    .groupBy((key, value) -> groupByLocation) // example key: canada
    .count("location-counts");

table
    .groupBy((key, value) -> groupByAgeGroup) // example key: 25-30
    .count("age-group-counts");

這導致了很多主題:

my-consumer-gender-counts-changelog
my-consumer-gender-counts-repartition
my-consumer-location-counts-changelog
my-consumer-location-counts-repartition
my-consumer-age-group-counts-changelog
my-consumer-age-group-counts-repartition

如果我們可以將多個聚合發送到單個狀態存儲,並將值按組包含在鍵中,那將會很好。 例如:

table
    .groupBy((key, value) -> groupByGender) // example key: female_gender
    .count("counts");

table
    .groupBy((key, value) -> groupByLocation) // example key: canada_location
    .count("counts");

table
    .groupBy((key, value) -> groupByAgeGroup) // example key: 25-30_age_group
    .count("counts");

這將導致更少的主題:

counts-changelog
counts-repartition

這當前似乎不可能(無論如何使用DSL),因為使用groupBy運算符會創建一個內部主題以進行重新分區,因此如果我們有多個子拓撲可以groupBy不同的東西,那么Kafka Streams將嘗試注冊相同的內容。從多個來源重新分配主題。 這會導致以下錯誤:

org.apache.kafka.streams.errors.TopologyBuilderException: Invalid topology building: Topic counts-repartition has already been registered by another source.
        at org.apache.kafka.streams.processor.TopologyBuilder.validateTopicNotAlreadyRegistered(TopologyBuilder.java:518)

如果groupBy可以返回多個記錄(例如像flatMap那樣),那么我們可以返回一組記錄(每個分組一個記錄),但這似乎也不可能使用DSL。

我的問題是,給定一個可以按多個值分組的記錄(例如{ "gender": "female", "location": "canada", "age-group": "25-30" } ),是否應該創建多個主題(每個分組2個)一直備受關注(例如,我們有100個不同的分組)? 當單個記錄可以按多個值分組時,還有其他策略可能更適合嗎? 我提出的建議(將多個聚合下沉到單個更改日志主題)是一個壞主意(即使唯一鍵的數量非常低)?

如果要按不同屬性進行分組,則無法避免多個重新分區主題。 假設您有兩個分組屬性g1g2以及三個具有以下值的記錄:

r1 = g1:A, g2:1
r2 = g1:A, g2:2
r3 = g1:B, g2:2

因此,為了基於g1正確地聚合記錄,必須將記錄r1r2組合在一起。 假設您的重新分區主題有2個分區p1p2 ,該記錄將重新分配

p1: r1, r2
p2: r3,

另一方面,如果您在r2聚合,則記錄r2r3必須組合在一起:

p1: r1
p2: r2,r3

請注意,對於這兩種情況, r2必須轉到不同的分區,因此,不可能使用單個主題,但每個分組需要一個主題。 (這不是Kafka特定的 - 任何其他框架都需要復制並重新分配日期多次)。

從理論上講,如果添加更多語義信息(如超密鑰,子密鑰或1對1密鑰映射),則可以減少主題數量。 但Kafka Streams(和AFAIK,沒有其他可比系統)不支持。

暫無
暫無

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

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