균형 작업 스케줄링

균형 작업 스케줄링 (Balanced Tasks Scheduling)

이 문서는 균형 작업 스케줄링(balanced tasks scheduling)의 배경과 원리, 그리고 스트리밍 작업 실행 시 이를 사용하는 방법을 설명합니다. 병렬도가 일치하지 않는 작업에서 TaskManager 간 작업 수 불균형을 개선합니다.

출처: 문서

본문

이 페이지는 균형 작업 스케줄링의 배경과 원리, 그리고 스트리밍 작업 실행 시 이를 사용하는 방법을 설명합니다.

배경 (Background)

Flink 스트리밍 작업 내 모든 버텍스의 병렬도가 일치하지 않을 때, Flink가 태스크를 배포하는 기본 전략은 때로 일부 TaskManager에는 태스크가 많고 다른 곳에는 적게 만들어, 더 많은 태스크를 가진 일부 TaskManager에서 리소스 사용률이 과도해져 전체 작업 처리의 병목이 될 수 있습니다.

그림 (a)에 나온 것처럼, 두 개의 버텍스 JobVertex-A (JV-A)JobVertex-B (JV-B)로 구성되고 병렬도가 각각 63이며 두 버텍스가 같은 슬롯 공유 그룹을 공유하는 Flink 작업을 가정해 보겠습니다. 기본 작업 스케줄링 전략에서 그림 (b)처럼 태스크가 TaskManager에 분포하면 작업 부하에 큰 격차가 생길 수 있습니다. 구체적으로, 태스크가 가장 많은 TaskManager4개의 태스크를, 부하가 가장 낮은 곳은 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-Bisloti에, 태스크 JV-Cisloti에 직접 할당됩니다.

  • 다음으로, 최대 미만의 병렬도를 가진 작업 버텍스에 속한 태스크는 현재 슬롯 공유 그룹 내 슬롯에 라운드 로빈 방식으로 모든 태스크가 할당될 때까지 분배됩니다.

그림 (e)에 나온 것처럼, 작업 수 기반 할당 전략에서는 슬롯당 태스크 수의 범위(최대-최소 차이)가 1로, 그림 (d)의 기본 전략에서의 범위 3보다 좋습니다.

따라서 이는 슬롯 간 태스크 수 분포를 더 균형 있게 보장합니다.

슬롯-TaskManager 할당 단계

그림 (f)에 나온 것처럼, 병렬도가 63인 두 버텍스 JV-AJV-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를 참고하세요.

더 알아보기 (Learn more)