수평 자동 확장

수평 자동 확장을 사용하면 Dataflow가 작업에 적절한 작업자 인스턴스 수를 선택하고 필요에 따라 작업자를 추가하거나 삭제합니다. Dataflow는 작업자의 평균 CPU 사용률과 파이프라인 동시 로드에 따라 확장됩니다. 파이프라인 동시 로드는 지정된 시간에 데이터를 가장 효율적으로 처리하는 데 필요한 스레드 예측 수입니다.

수평 자동 확장은 일괄 파이프라인과 스트리밍 파이프라인 모두에서 지원됩니다.

일괄 자동 확장

수평 자동 확장은 모든 일괄 파이프라인에서 기본적으로 사용 설정됩니다. Dataflow는 파이프라인의 각 단계에서 예상되는 총 작업량을 기반으로 작업자 수를 자동으로 선택합니다. 이 예상 값은 입력 크기 및 현재 처리량에 따라 달라집니다. Dataflow는 30초마다 실행 진행 상황에 따라 작업량을 재평가합니다. 총 예상 작업량이 증가하거나 감소하게 되면 Dataflow는 작업자 수를 동적으로 확장하거나 축소합니다.

작업자 수는 작업량에 저선형적입니다. 예를 들어 작업량은 두 배인데 작업자 수는 두 배보다 적은 작업입니다.

다음과 같은 조건이 발생하면 Dataflow는 유휴 리소스를 절약하기 위해 작업자 수를 유지하거나 줄입니다.

  • 평균 작업자 CPU 사용량이 5% 미만입니다.
  • 동시 로드는 압축 파일로 인한 분할할 수 없는 데이터 또는 분할되지 않은 I/O 모듈과 같은 동시 로드할 수 없는 작업으로 제한됩니다.
  • 예를 들어 Cloud Storage의 기존 파일에 쓸 때 동시 로드 수준이 고정되어 있습니다.

작업자 수의 상한을 설정하려면 --maxNumWorkers 파이프라인 옵션을 설정합니다. 일괄 작업의 경우 이 플래그는 선택사항입니다. 기본값은 1000입니다.

스트리밍 자동 확장

스트리밍 작업의 경우 수평 자동 확장을 사용하면 Dataflow가 로드 및 리소스 사용률의 변화에 따라 작업자 수를 적응적으로 변경할 수 있습니다.

수평 자동 확장은 기본적으로 Streaming Engine을 사용하는 스트리밍 작업에 대해 사용 설정됩니다. Streaming Engine을 사용하지 않는 스트리밍 작업에 수평 자동 확장을 사용하려면 파이프라인을 시작할 때 다음 파이프라인 옵션을 설정합니다.

Java

--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를 최대 작업자 인스턴스 수로 바꿉니다.

수평 자동 확장 중지

수평 자동 확장을 사용 중지하려면 작업을 실행할 때 다음 파이프라인 옵션을 설정합니다.

Java

--autoscalingAlgorithm=NONE

수평 자동 확장을 사용 중지하면 Dataflow는 --numWorkers 옵션을 기준으로 작업자 수를 설정합니다.

Python

--autoscaling_algorithm=NONE

수평 자동 확장을 사용 중지하면 Dataflow는 --num_workers 옵션을 기준으로 작업자 수를 설정합니다.

Go

--autoscaling_algorithm=NONE

수평 자동 확장을 사용 중지하면 Dataflow는 --num_workers 옵션을 기준으로 작업자 수를 설정합니다.

커스텀 소스

커스텀 데이터 소스를 만들 경우 수평 자동 확장 알고리즘에 더 많은 정보를 제공하는 방법을 구현하여 잠재적으로 성능을 개선할 수 있습니다.

Java

제한된 소스

  • 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 변환은 스트리밍 자동 확장에서 지원되지 않습니다. 파이프라인에서 PeriodicImpulse를 사용하는 경우 Dataflow 작업자가 예상한 대로 축소되지 않습니다.

다음 단계