균형 작업 스케줄링
균형 작업 스케줄링 (Balanced Tasks Scheduling)
이 문서는 균형 작업 스케줄링(balanced tasks scheduling)의 배경과 원리, 그리고 스트리밍 작업 실행 시 이를 사용하는 방법을 설명합니다. 병렬도가 일치하지 않는 작업에서 TaskManager 간 작업 수 불균형을 개선합니다.
출처: 문서
본문
이 페이지는 균형 작업 스케줄링의 배경과 원리, 그리고 스트리밍 작업 실행 시 이를 사용하는 방법을 설명합니다.
배경 (Background)
Flink 스트리밍 작업 내 모든 버텍스의 병렬도가 일치하지 않을 때, Flink가 태스크를 배포하는 기본 전략은 때로 일부 TaskManager에는 태스크가 많고 다른 곳에는 적게 만들어, 더 많은 태스크를 가진 일부 TaskManager에서 리소스 사용률이 과도해져 전체 작업 처리의 병목이 될 수 있습니다.
그림 (a)에 나온 것처럼, 두 개의 버텍스 JobVertex-A (JV-A)와 JobVertex-B (JV-B)로 구성되고 병렬도가 각각 6과 3이며 두 버텍스가 같은 슬롯 공유 그룹을 공유하는 Flink 작업을 가정해 보겠습니다. 기본 작업 스케줄링 전략에서 그림 (b)처럼 태스크가 TaskManager에 분포하면 작업 부하에 큰 격차가 생길 수 있습니다. 구체적으로, 태스크가 가장 많은 TaskManager는 4개의 태스크를, 부하가 가장 낮은 곳은 2개의 태스크만 가질 수 있습니다. 결과적으로 4개의 태스크를 가진 TaskManager가 전체 작업의 성능 병목이 되기 쉽습니다.
따라서 Flink는 작업 수 기반의 균형 작업 스케줄링 기능을 제공합니다. 작업의 리소스 뷰 안에서 각 TaskManager에 스케줄되는 태스크 수를 가능한 한 비슷하게 만들어 TaskManager 간 리소스 사용 편향을 개선하는 것을 목표로 합니다.
참고 병렬도가 일치하지 않다는 것이 반드시 이 전략을 사용해야 함을 의미하지는 않습니다. 실제로 항상 그런 것은 아닙니다.
원리 (Principle)
작업 수 기반의 로드 밸런싱 작업 스케줄링 전략은 두 단계로 TaskManager에 태스크 할당을 완료합니다:
- 태스크-슬롯 할당 단계 (tasks-to-slots assignment phase)
- 슬롯-TaskManager 할당 단계 (slots-to-TaskManagers assignment phase)
이 섹션은 두 가지 예시로 작업 수 기반 작업 스케줄링 전략이 이 두 단계에서 할당을 처리하는 단순화된 과정과 원리를 설명합니다.
태스크-슬롯 할당 단계
그림 (c)에 나온 작업을 예로 들면, 병렬도가 각각 1, 4, 4, 2, 3인 다섯 개의 작업 버텍스를 포함합니다. 다섯 개의 작업 버텍스 모두 기본 슬롯 공유 그룹에 속합니다.
태스크-슬롯 할당 단계에서 이 작업 스케줄링 전략은:
-
먼저 병렬도가 가장 높은 버텍스의 태스크를
i-th슬롯에 직접 할당합니다.즉, 태스크
JV-Bi는sloti에, 태스크JV-Ci는sloti에 직접 할당됩니다. -
다음으로, 최대 미만의 병렬도를 가진 작업 버텍스에 속한 태스크는 현재 슬롯 공유 그룹 내 슬롯에 라운드 로빈 방식으로 모든 태스크가 할당될 때까지 분배됩니다.
그림 (e)에 나온 것처럼, 작업 수 기반 할당 전략에서는 슬롯당 태스크 수의 범위(최대-최소 차이)가 1로, 그림 (d)의 기본 전략에서의 범위 3보다 좋습니다.
따라서 이는 슬롯 간 태스크 수 분포를 더 균형 있게 보장합니다.
슬롯-TaskManager 할당 단계
그림 (f)에 나온 것처럼, 병렬도가 6과 3인 두 버텍스 JV-A와 JV-B로 구성되고 두 버텍스가 같은 슬롯 공유 그룹을 공유하는 Flink 작업을 가정합니다.
첫 단계 후의 할당 결과는 그림 (g)와 같으며, Slot0, Slot1, Slot2는 각각 2개의 태스크를, 나머지 슬롯은 각각 1개의 태스크를 가집니다.
이어서:
- 전략은 모든 슬롯 요청을 제출하고 현재 작업에 필요한 모든 슬롯 리소스가 준비될 때까지 기다립니다.
슬롯 리소스가 준비되면:
- 전략은 모든 슬롯 요청을 각 요청에 포함된 태스크 수 기준 내림차순으로 정렬합니다. 그런 다음 각 슬롯 요청을 현재 작업 부하가 가장 작은
TaskManager에 순차적으로 할당합니다. 이 과정은 모든 슬롯 요청이 할당될 때까지 계속됩니다.
최종 할당 결과는 그림 (i)와 같으며, 각 TaskManager는 정확히 3개의 태스크로 끝나 TaskManager 간 태스크 수 차이가 0이 됩니다. 반면 그림 (h)에 나온 기본 전략의 스케줄링 결과는 TaskManager 간 태스크 수 차이가 2입니다.
따라서 위에서 설명한 종류의 성능 병목을 보고 있다면 이 로드 밸런싱 작업 스케줄링 전략을 사용하여 성능을 개선할 수 있습니다. 이러한 병목이 보이지 않는다면 성능 저하가 발생할 수 있으므로 이 전략을 사용하지 말아야 합니다.
사용법 (Usage)
다음 구성 항목을 통해 균형 작업 스케줄링을 활성화할 수 있습니다:
taskmanager.load-balance.mode:tasks
참고 장애 조치(failover) 시나리오에서 리소스가 해제되고 리소스 요청이 처리될 때 리소스 뷰의 지연된 업데이트로 인해 최적으로 균형 잡히지 않은 할당 결과가 나올 수 있습니다. 이 경우
slot.request.max-interval값을 적절히 늘려 상황을 개선할 수 있습니다. 예를 들어 조정마다50밀리초씩 늘려 시도해 볼 수 있습니다. 이 값을 올리면 작업 스케줄링 중 슬롯 요청과 사용 가능한 리소스 뷰가 더 안정되어 태스크가 가능한 한 균형 있게 할당됩니다. 그러나 이는 작업 스케줄링 단계의 전체 기간도 늘립니다. 따라서 이 구성 값을 늘리면slot.request.timeout파라미터 타임아웃 위험도 커집니다. 옵션 값을 충분히 늘렸는데도 최적의 작업 균형이 발생하지 않으면 FLINK-38715에 보고할 수 있습니다. 보고에는 스케줄링 관련 구성과 관찰된 현상에 대한 설명이 포함되어야 합니다.
더 자세히 (More details)
자세한 내용은 FLIP-370를 참고하세요.