본문 바로가기

게으른개발자/공부

Kafka Streams 파티션 할당 과정

Kafka Streams 애플리케이션에서 파티션은 논리적 단위인 Task에 할당된다는 점은 기본적으로 알고 있지만, Task는 애플리케이션의 성능과 데이터 처리 효율성에 중요한 영향을 미치기 때문에, Task에 파티션이 할당되는 과정을 더 자세히 이해할 필요가 있다.


우선적으로 StreamsPartitionAssignor에 대해 알 필요가 있다.

StreamsPartitionAssignor란?

  • ConsumerPartitionAssignor
    • 설명:  Kafka의 컨슈머 그룹에서 사용되는 인터페이스로, 특정 토픽의 파티션을 컨슈머 그룹 내의 각 컨슈머에게 어떻게 할당할지를 결정하는 역할
    • 대표 구현체
      • RangeAssignor
      • RoundRobinAssignor
      • StickyAssignor
      • StreamsPartitionAssignor
  • StreamsPartitionAssignor
    • 설명: Kafka Streams 어플리케이션에서  사용되는 Partition Assignor  ( ConsumerPartitionAssignor 의 구현체)
    • 특징
      • 스트림 처리를 위해 데이터 처리의 논리적 단위인 Task를 통해 클라이언트 및 스레드에 할당하는 핵심 역할을 수행
        • topic partition 을 task에 할당 →  task들을 모든 StreamThread 에 할당
      • Kafka Streams 어플리케이션을 사용시 필수로 사용해야함. (변경 불가)
        • > StreamsPartitionAssignor class and doesn’t let you change to a different assignor. If you try to use a different assignor, Kafka Streams ignores it.  → 참고


 

 

 

StreamsPartitionAssignor 간략 동작 과정

간략 동작 과정 

1. Topic Partitioin 을 기반으로 Task 생성




2. Task에 Topic Partition 들 을 할당

  • Task는 Topic이 달라도 동일한 Partition을 관리
  • ex)
    • id가 0_0인 Task는 구독중인 Topic의 0번 파티션을 전부 할당
    • test-topic (파티션1개), test-topic2 (파티션1개), test-topic3(파티션5개) 를 구독하는 경우

 



3. Task를 StreamThread에 분배 
  • partition이 할당된 Task는 실행 중인 애플리케이션 인스턴스의 모든 스레드에 분배




 
 

 

 

 

결론

파티션 개수가 다른 여러 토픽을 컨슈밍하는 KafkaStreams 애플리케이션은 Task들에 균등한 개수의 Partition 할당이 되지 않는다.

하지만 아래와 같은 파훼법(?)은 있을수 있다.

 

 

 

topology 다양화

taskID 의 이름 구성요소는 subtopology (aka topicGroupId)와 parititon을 의미합니다.

즉, 0_0은 subtopology 0번과 0번 파티션  0_1은   subtopology 0번과 1번 파티션 이다.  → Topology는 데이터 처리 로직을 정의하는 구조이며, Task는 이 Topology를 실행하여 데이터를 처리하는 단위

 

위에서 언급되었던 Task들에 균등한 개수의 Partition 할당이 되지 않는 문제 는 단일 토폴로지였기 때문에 발생하는 것이다.  → task 0_0이 모든 토픽의 0번 partition을 구독함.  즉 task를 다양화 하면 각각 구독하는 토픽이 다양화되어 partition이 분할됨

 

요약하자면

  • 태스크와 서브-토폴로지의 관계: 카프카 스트림에서 각 태스크는 하나의 서브-토폴로지를 처리합니다. 즉, 애플리케이션의 전체 데이터 처리 흐름을 여러 개의 서브-토폴로지로 분리하여 병렬 처리가 가능하도록 설계됨.
  • 병렬 처리의 확장: 이 접근 방식은 계산 작업을 여러 태스크로 확장시켜, 시스템의 처리 성능과 확장성을 크게 향상시킬 수 있음. 각 태스크는 독립적으로 동작할 수 있기 때문에, 전체 데이터 처리량이 증가하더라도 작업이 적절히 분산되어 고성능 처리가 가능.

https://docs.confluent.io/platform/current/streams/architecture.html#sub-topologies-also-called-sub-graphs

> Each task may instantiate only one such sub-topology for processing. This further scales out the computational workload to multiple tasks.

 

 

 

 

 

 

------------------------------------------------------------------------------------------------------------------------------

추가 내용

TaskAssignor 란?

설명

Kafka Streams에서 스트림 처리 Task를 클라이언트 인스턴스(StreamThread) 에 할당하는 데 사용되는 인터페이스

즉, Task를 StreamThread에 분배 하는 역할

(custom task assignor를  Apache Kafka® 3.8 부터 지원)