2017-05-22 4 views
1

들어오는 메시지를 여러 값으로 그룹화하는 Kafka Streams 앱이 있습니다. 예를 들면 :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을 사용하여 가능할 것 같습니다.

여러 질문 (여러 개의 그룹에 대해 2 개)을 작성해야하는 경우 여러 개의 값 (예 : { "gender": "female", "location": "canada", "age-group": "25-30" })으로 그룹화 할 수있는 단일 레코드가 주어진다면 (예 : 100 개의 그룹화가 있었던 경우) ? 하나의 레코드가 여러 값으로 그룹화 될 수있을 때 더 적합한 다른 전략이 있습니까? 내가 (고유 한 키의 수가 매우 적은 경우에도) 단일 아이디어에 여러 집계를 함부로 제안하는 것은 나쁜 생각입니까?

답변

1

다른 속성으로 그룹화하려는 경우 다중 분할 주제를 피할 수 없습니다. 두 그룹은 다음과 같은 값으로 g1g2와 세 개의 레코드 속성이 있다고 가정 :

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

가 제대로 g1에 따라 기록을 집계, 기록 r1r2가 함께 그룹화해야합니다. 당신이 r2에 집계 경우 가정 당신의 재분할 주제 2 개 파티션 p1p2을 가지고, 레코드, 다른 한편으로

p1: r1, r2 
p2: r3, 

같은 재배포를 얻을 것, r2 기록하고 r3 함께 그룹화해야합니다

p1: r1 
p2: r2,r3 

r2은 두 경우 모두 다른 파티션으로 이동해야하므로 단일 주제를 사용할 수는 없지만 그룹당 하나의 주제가 필요합니다. (이것은 카프카 고유의 것이 아니며 다른 프레임 워크는 날짜를 여러 번 복제하고 재배포해야합니다).

이론적으로 더 많은 의미 론적 정보 (예 : 수퍼 키, 하위 키 또는 일대일 키 매핑)를 추가하면 주제의 수를 줄일 수 있습니다. 그러나 Kafka Streams (및 AFAIK, 다른 유사한 시스템 없음)에서는이를 지원하지 않습니다.