수평 자동 확장을 사용하면 Dataflow가 작업에 적절한 작업자 인스턴스 수를 선택하고 필요에 따라 작업자를 추가하거나 삭제합니다. Dataflow는 작업자의 평균 CPU 사용률과 파이프라인 동시 로드에 따라 확장됩니다. 파이프라인 동시 로드는 지정된 시간에 데이터를 가장 효율적으로 처리하는 데 필요한 스레드 예측 수입니다.
수평 자동 확장은 일괄 파이프라인과 스트리밍 파이프라인 모두에서 지원됩니다.
일괄 자동 확장
수평 자동 확장은 모든 일괄 파이프라인에서 기본적으로 사용 설정됩니다. Dataflow는 파이프라인의 각 단계에서 예상되는 총 작업량을 기반으로 작업자 수를 자동으로 선택합니다. 이 예상치는 입력 크기와 현재 처리량에 따라 달라집니다. Dataflow는 30초마다 실행 진행 상황에 따라 작업량을 재평가합니다. 총 예상 작업량이 증가하거나 감소하게 되면 Dataflow는 작업자 수를 동적으로 확장하거나 축소합니다.
작업자 수는 작업량에 저선형적입니다. 예를 들어 작업량은 두 배인데 작업자 수는 두 배보다 적은 작업입니다.
다음과 같은 조건이 발생하면 유휴 리소스를 절약하기 위해 Dataflow가 작업자 수를 유지하거나 줄입니다.
- 평균 작업자 CPU 사용량이 5% 미만입니다.
- 동시 로드는 압축 파일로 인한 분할할 수 없는 데이터 또는 분할되지 않은 I/O 모듈과 같은 동시 로드할 수 없는 작업으로 제한됩니다.
- 동시 로드 수는 고정되어 있습니다(예: Cloud Storage의 기존 파일에 쓰는 경우).
작업자 수의 상한을 설정하려면 --maxNumWorkers
파이프라인 옵션을 설정하세요.
기본값은 2,000
입니다.
작업자 수의 하한을 설정하려면 --min_num_workers
서비스 옵션을 설정하세요.
이러한 플래그는 선택사항입니다.
스트리밍 자동 확장
스트리밍 작업의 경우 수평 자동 확장을 사용하면 Dataflow가 로드 및 리소스 사용률의 변화에 따라 작업자 수를 적응적으로 변경할 수 있습니다.
수평 자동 확장은 Streaming Engine을 사용하는 스트리밍 작업에 기본적으로 사용 설정됩니다. Streaming Engine을 사용하지 않는 스트리밍 작업에 수평 자동 확장을 사용 설정하려면 파이프라인을 시작할 때 다음 파이프라인 옵션을 설정하세요.
자바
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
MAX_WORKERS를 최대 작업자 인스턴스 수로 바꿉니다.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
MAX_WORKERS를 최대 작업자 인스턴스 수로 바꿉니다.
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
MAX_WORKERS를 최대 작업자 인스턴스 수로 바꿉니다.
작업자 수의 하한을 설정하려면 --min_num_workers
서비스 옵션을 설정하세요.
이 값을 설정하면 수평 자동 확장이 지정된 작업자 수 미만으로 확장되지 않습니다. 이 플래그는 선택사항입니다.
수평 자동 확장 중지
수평 자동 확장을 사용 중지하려면 작업을 실행할 때 다음 파이프라인 옵션을 설정합니다.
자바
--autoscalingAlgorithm=NONE
수평 자동 확장을 사용 중지하면 Dataflow는 --numWorkers
옵션에 따라 작업자 수를 설정합니다.
Python
--autoscaling_algorithm=NONE
수평 자동 확장을 사용 중지하면 Dataflow는 --num_workers
옵션에 따라 작업자 수를 설정합니다.
Go
--autoscaling_algorithm=NONE
수평 자동 확장을 사용 중지하면 Dataflow는 --num_workers
옵션에 따라 작업자 수를 설정합니다.
커스텀 소스
맞춤 데이터 소스를 만드는 경우 수평 자동 확장 알고리즘에 더 많은 정보를 제공하는 메서드를 구현하여 성능을 개선할 수 있습니다.
자바
제한된 소스
BoundedSource
서브클래스에서getEstimatedSizeBytes
메서드를 구현합니다. Dataflow 서비스는 파이프라인에 사용할 초기 작업자 수를 계산할 때getEstimatedSizeBytes
을 사용합니다.BoundedReader
서브클래스에서getFractionConsumed
메서드를 구현합니다. Dataflow 서비스는getFractionConsumed
를 사용하여 읽기 진행 상황을 추적하고 읽는 중에 사용할 올바른 작업자 수를 수렴합니다.
제한되지 않은 소스
소스는 Dataflow 서비스에 백로그에 대한 정보를 제공해야 합니다.
백로그는 소스에서 아직 처리하지 않은 입력 추정치(바이트 단위)입니다. 서비스에 백로그에 관한 정보를 제공하려면 UnboundedReader
클래스에서 다음 메서드 두 개 중 하나를 구현합니다.
getSplitBacklogBytes()
- 현재 소스 분할에 대한 백로그입니다. 서비스는 모든 분할에 걸쳐 백로그를 집계합니다.getTotalBacklogBytes()
- 모든 분할에 걸친 전체 백로그입니다. 각 분할에 대한 백로그가 제공되지 않고 모든 분할에 대해서만 계산할 수 있는 경우도 있습니다. 첫 번째 분할(분할 ID '0')만 전체 백로그를 제공해야 합니다.
Apache Beam 저장소에는 UnboundedReader
클래스를 구현하는 여러 가지 커스텀 소스 예시가 있습니다.
Python
제한된 소스
BoundedSource
서브클래스에서estimate_size
메서드를 구현합니다. Dataflow 서비스는 파이프라인에 사용할 초기 작업자 수를 계산할 때estimate_size
을 사용합니다.RangeTracker
서브클래스에서fraction_consumed
메서드를 구현합니다. Dataflow 서비스는fraction_consumed
를 사용하여 읽기 진행 상황을 추적하고 읽는 중에 사용할 올바른 작업자 수를 수렴합니다.
Go
제한된 소스
RangeTracker
에서GetProgress()
메서드를 구현합니다. Dataflow 서비스는GetProgress
을 사용하여 읽기 진행 상황을 추적하고 읽기 작업에 사용할 올바른 작업자 수를 수렴합니다.
제한사항
- Dataflow Prime을 실행하는 작업에서 수평 자동 확장은 수직 자동 확장을 수행하는 동안 그리고 그 이후 최대 10분 동안 비활성화됩니다. 자세한 내용은 수평 자동 확장에 대한 영향을 참조하세요.
- Dataflow Shuffle을 사용하지 않는 파이프라인의 경우 작업자가 로컬 디스크에 저장된 데이터를 셔플했을 수 있으므로 Dataflow가 작업자를 효과적으로 축소하지 못할 수 있습니다.
- PeriodicImpulse 변환은 Apache Beam SDK 버전 2.60.0 이상에서 스트리밍 자동 확장과 함께 지원됩니다. 파이프라인에서 이전 SDK 버전과 함께
PeriodicImpulse
를 사용하는 경우 Dataflow 작업자가 예상한 대로 축소되지 않습니다.