[Concept] 2. Apache Flink의 Task Slot과 병렬 처리

y001·2026년 1월 10일

Apache Flink Hands-On

목록 보기
15/17

1. Task Slot

Apache Flink에서 Task Slot은 태스크가 실제로 실행되는 실행 단위이다. 하나의 TaskManager는 여러 개의 Slot을 가지며, JobManager는 태스크를 TaskManager 자체가 아니라 Slot 단위로 배치한다. 이 때문에 Slot은 Flink에서 병렬 실행이 실제로 이루어지는 기준이 된다.

1-1. Task Slot Resource

Task Slot은 완전히 독립된 컨테이너는 아니다. TaskManager가 가진 리소스를 Slot 단위로 나누어 사용하지만, 리소스 종류에 따라 분리 방식은 다르다. 이 구조로 인해 Slot 수를 늘리면 동시에 실행 가능한 Task 수는 증가하지만, 각 Slot이 사용할 수 있는 리소스의 양은 감소한다.

리소스 종류Slot 간 분리 방식특징
Managed MemorySlot 단위 정적 분할Slot 수가 증가할수록 슬롯당 메모리 크기는 감소한다. 정렬, 해시 등 내부 연산에 사용된다.
Heap MemoryTaskManager 전체 공유특정 Slot의 힙 사용량 증가가 다른 Slot에 영향을 줄 수 있다.
네트워크 버퍼TaskManager 전체 공유활성 채널 수에 따라 동적으로 사용된다. 셔플이 많을수록 사용량이 증가한다.
CPU고정 분할 없음Slot은 스레드 단위로 실행되며, 실제 CPU 사용량은 OS 스케줄러에 의해 경쟁적으로 분배된다.

2. Slot과 병렬도

다음과 같은 DataStream 코드가 있다고 가정한다.

DataStream<Event> stream = env.fromSource(source, ...);

stream
  .map(new ParseEvent())
  .filter(new ValidEventOnly())
  .keyBy(Event::userId)
  .process(new EnrichEvent())
  .sinkTo(sink);

이 코드는 하나의 스트림처럼 보이지만, 실행 시에는 병렬도가 적용되어 여러 실행 단위로 분해된다. Flink는 먼저 연산자 사이에 데이터 재분배가 필요한지를 판단하고, 재분배가 필요 없는 연산자들을 묶어 연산자 체인을 구성한다. 이 체인을 기준으로 JobGraph가 생성된다.

병렬도가 적용되면 JobGraph는 ExecutionGraph로 확장된다. 이 과정에서 하나의 JobVertex는 병렬도 수만큼의 ExecutionVertex로 분리된다. ExecutionVertex는 실제 실행되는 Task이며, TaskManager의 Slot에 배치되는 최소 실행 단위이다.

병렬도를 높이면 ExecutionVertex의 수가 증가하고, 더 많은 Slot이 사용된다. 동시에 실행되는 Task 수는 증가하지만, Slot 하나가 사용할 수 있는 메모리와 CPU 자원은 줄어든다.

2-1. 병렬도를 산정하는 방법

병렬도는 다음 두 기준을 함께 고려해 산정한다.

  • 전체 작업 기본 병렬도
  • 연산자별 개별 병렬도

Source 연산자의 병렬도는 외부 시스템의 분할 단위에 의해 제한된다. Kafka Source의 경우 하나의 Consumer 스레드는 하나의 파티션을 처리하므로, 일반적으로 파티션 수를 Source 병렬도로 설정한다. 이 값을 초과해 병렬도를 높여도 처리량은 증가하지 않는다.

연산자 병렬도는 병목 지점을 기준으로 조정한다. CPU 연산이 무거운 연산자는 병렬도 증가를 고려할 수 있지만, 외부 시스템과 연결된 Sink는 커넥션 수와 처리 한계를 기준으로 병렬도를 제한한다.

2-2. Slot Sharing

ExecutionVertex를 Slot에 하나씩만 배치하면 연산자 수와 병렬도에 비례해 Slot 수가 급격히 증가한다. 이는 Slot당 리소스 감소와 네트워크 비용 증가로 이어진다.

이를 방지하기 위해 Flink는 Slot Sharing을 사용한다. Slot Sharing은 하나의 Slot에 여러 ExecutionVertex를 함께 배치하는 방식으로, 동일한 파이프라인에 속한 연산자들이 Slot을 공유하도록 한다. 이 기능은 기본값으로 활성화되어 있으며, 별도의 설정 없이 동작한다. Slot Sharing Group을 명시적으로 분리하지 않는 한, Flink는 자동으로 Slot 공유를 적용한다.

Slot Sharing을 통해 전체 Slot 수는 최대 병렬도 수준으로 제한되며, 불필요한 리소스 낭비를 줄일 수 있다.

3. Slot의 개수

TaskManager는 여러 개의 Slot을 가지며, 이 값은 TaskManager 하나가 동시에 수용할 수 있는 실행 단위의 수를 의미한다.
일반적인 권장 기준은 다음과 같다.

  • TaskManager CPU 코어 수와 동일하거나 약간 작게 설정
  • 예: 8코어 → Slot 6~8개

Slot은 CPU 경쟁을 허용하는 실행 단위의 개수를 의미한다. Slot 수가 CPU 코어 수를 초과하면 경쟁이 심해지고, Slot 수가 너무 적으면 CPU를 충분히 활용하지 못한다. 따라서 Slot 개수는 CPU 코어 수를 기준으로 하되, JVM과 네트워크 처리에 필요한 오버헤드를 고려해 약간의 여유를 두는 것이 일반적이다.

Slot이 너무 많으면 동시에 실행되는 스레드 수가 과도해져 컨텍스트 스위칭이 증가하고, CPU 오버헤드로 인해 성능이 저하된다. 반대로 Slot이 너무 적으면 병렬도를 충분히 활용하지 못해 리소스 유휴가 발생하고 전체 처리량이 감소한다.

0개의 댓글