본문 바로가기

빅데이터/Kafka

카프카 프로듀서 파티셔너 종류 및 정리(2.5.0 기준)

카프카 프로듀서는 레코드를 전송하기 위해 파티셔너를 제공합니다. 파티셔너 종류와 각 파티셔너에 대한 설명을 정리해보았습니다. 카프카 버젼이 올라감에 따라 파티셔너의 종류도 달라졌는데 여기서는 2.5.0 버젼의 파티셔너를 정리해보겠습니다.

프로듀서 파티셔너 인터페이스에 대한 설명은 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/?org/apache/kafka/clients/producer/Partitioner.html

 

kafka 2.5.0 API

 

kafka.apache.org

메시지 키가 있을 때
메시지 키가 있을 경우에는 파티셔너의 종류와 관계없이 동일하게 동작합니다. 메시지 키의 해쉬값을 구해서 해당 해쉬값과 파티션을 매칭하여 적재합니다. 이로 인해 동일한 메시지 키를 가진 레코드는 동일한 파티션에 들어가게 됩니다. 다만 주의할 점은 파티션 개수가 늘어날 때 입니다. 파티션 개수가 늘어나면 메시지 키 해시값과 파티션 매칭이 틀어지게 되어 파티션 증가 전후로 동일한 메시지 키더라도 다른 파티션에 레코드가 들어갈 수 있으므로 주의해야 합니다.

UniformStickyPartitioner

유니폼 스티키 파티션은 2.4.0 부터 기본 설정으로 사용되는 파티셔너입니다. 이 파티셔너는 스티키 파티셔너라고도 부릅니다. 스티키 파티션은 라운드-로빈 파티셔너와 다르게 프로듀서 내부동작에 특화되어 있습니다. 특히 배치전송에 특화되어 있는데요. 프로듀서는 파티션에 데이터를 전송하기 전에 어큐뮤레이터(Accumulator)에 데이터를 버퍼로 쌓아 놓고 발송합니다. 스티키 파티셔너를 사용할 경우 어큐뮤레이터의 버퍼를 채워서 보내기 때문에 성능향상에서 유리합니다.

https://www.confluent.io/blog/apache-kafka-producer-improvements-sticky-partitioner/

KIP-480 implements a new partitioner, which chooses the sticky partition that changes when the batch is full if no partition or key is present. Using the sticky partitioner helps improve message batching, decrease latency, and reduce the load for the broker. Some of the benchmarks which Justine Olshan discusses on the KIP show up to a 50% reduction in latency and 5–15% reduction in CPU utilization.

RoundRobinPartitioner

메시지 키가 없을 경우, 라운드-로빈 방식으로 데이터가 들어오는대로 파티션을 순회하면서 레코드를 넣습니다. 파티션 개수가 늘어날때도 마찬가지로 순회하면서 지속적으로 데이터를 분배하면서 넣습니다.

https://www.confluent.io/blog/apache-kafka-producer-improvements-sticky-partitioner/