Ajuste de escala automático horizontal

El ajuste de escala automático horizontal permite que Dataflow elija la cantidad adecuada de instancias de trabajador para tu trabajo y agregue o quite trabajadores según sea necesario. Dataflow escala en función del uso de CPU promedio de los trabajadores y del paralelismo de una canalización. El paralelismo de una canalización es una estimación de la cantidad de subprocesos necesarios para procesar los datos de la manera más eficiente en un momento determinado.

El ajuste de escala automático horizontal es compatible con canalizaciones por lotes y de transmisión.

Ajuste de escala automático por lotes

El ajuste de escala automático horizontal está habilitado de forma predeterminada en todas las canalizaciones por lotes. Dataflow elige de forma automática la cantidad de trabajadores en función de la cantidad total estimada de trabajo en cada etapa de la canalización. Esta estimación depende del tamaño de entrada y la capacidad de procesamiento actual. Cada 30 segundos, Dataflow vuelve a evaluar la cantidad de trabajo según el progreso de la ejecución. A medida que la cantidad total estimada de trabajo aumenta o disminuye, Dataflow aumenta o disminuye de forma dinámica la cantidad de trabajadores.

La cantidad de trabajadores es sublineal a la cantidad de trabajo. Por ejemplo, un trabajo con el doble de tareas tiene menos del doble de trabajadores.

Si se produce alguna de las siguientes condiciones, Dataflow mantiene o disminuye la cantidad de trabajadores para ahorrar recursos inactivos:

  • El uso promedio de CPU de los trabajadores es menor que el 5%.
  • El paralelismo se limita debido a un trabajo no paralelizable, como datos que no se pueden dividir causados por archivos comprimidos o módulos de E/S que no se dividen.
  • El grado de paralelismo es fijo, por ejemplo, cuando se escriben en archivos existentes en Cloud Storage.

Para establecer un límite superior en la cantidad de trabajadores, establece la opción de canalización --maxNumWorkers. El valor predeterminado es 2,000. Para establecer un límite inferior en la cantidad de trabajadores, establece la opción de servicio --min_num_workers. Estas marcas son opcionales.

Ajuste de escala automático de transmisión

En los trabajos de transmisión, el ajuste de escala automático horizontal permite que Dataflow cambie la cantidad de trabajadores de forma adaptable en respuesta a los cambios en la carga y el uso de recursos.

El ajuste de escala automático horizontal está habilitado de forma predeterminada para los trabajos de transmisión que usan Streaming Engine. Para habilitar el ajuste de escala automático horizontal de trabajos de transmisión que no usan Streaming Engine, configura las siguientes opciones de canalización cuando la inicies:

Java

--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS

Reemplaza MAX_WORKERS por la cantidad máxima de instancias de trabajador.

Python

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

Reemplaza MAX_WORKERS por la cantidad máxima de instancias de trabajador.

Go

--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS

Reemplaza MAX_WORKERS por la cantidad máxima de instancias de trabajador.

Para establecer un límite inferior en la cantidad de trabajadores, establece la opción de servicio --min_num_workers. Cuando estableces este valor, el ajuste de escala automático horizontal no se reduce por debajo de la cantidad de trabajadores especificada. Esta marca es opcional.

Inhabilita el ajuste de escala automático horizontal

Para inhabilitar el ajuste de escala automático horizontal, configura la siguiente opción de canalización cuando ejecutes el trabajo.

Java

--autoscalingAlgorithm=NONE

Si inhabilitas el ajuste de escala automático horizontal, Dataflow establece la cantidad de trabajadores según la opción --numWorkers.

Python

--autoscaling_algorithm=NONE

Si inhabilitas el ajuste de escala automático horizontal, Dataflow establece la cantidad de trabajadores según la opción --num_workers.

Go

--autoscaling_algorithm=NONE

Si inhabilitas el ajuste de escala automático horizontal, Dataflow establece la cantidad de trabajadores según la opción --num_workers.

Fuentes personalizadas

Si creas una fuente de datos personalizada, puedes mejorar el rendimiento implementando métodos que proporcionen más información al algoritmo de ajuste de escala automático horizontal:

Java

Fuentes delimitadas

  • En la subclase BoundedSource, implementa el método getEstimatedSizeBytes. El servicio de Dataflow usa getEstimatedSizeBytes cuando calcula la cantidad inicial de trabajadores para usar en la canalización.
  • En la subclase BoundedReader, implementa el método getFractionConsumed. El servicio de Dataflow usa getFractionConsumed para realizar un seguimiento del progreso de lectura y converger en la cantidad correcta de trabajadores que se usarán durante una lectura.

Fuentes no delimitadas

La fuente debe informar al servicio de Dataflow sobre el trabajo pendiente. El trabajo pendiente es una estimación de la entrada en bytes que la fuente aún no procesó. Para informar al servicio sobre el trabajo pendiente, implementa cualquiera de los siguientes métodos en tu clase UnboundedReader.

  • getSplitBacklogBytes(): Trabajo pendiente para la división actual de la fuente. El servicio agrega el trabajo pendiente en todas las divisiones.
  • getTotalBacklogBytes(): Es el trabajo pendiente global en todas las divisiones. En algunos casos, el trabajo pendiente no está disponible para cada división y solo se puede calcular el total de todas las divisiones. Solo la primera división (ID de división “0”) debe proporcionar su trabajo pendiente total.

El repositorio de Apache Beam contiene varios ejemplos de fuentes personalizadas que implementan la clase UnboundedReader.

Python

Fuentes delimitadas

  • En la subclase BoundedSource, implementa el método estimate_size. El servicio de Dataflow usa estimate_size cuando calcula la cantidad inicial de trabajadores para usar en la canalización.
  • En la subclase RangeTracker, implementa el método fraction_consumed. El servicio de Dataflow usa fraction_consumed para realizar un seguimiento del progreso de lectura y converger en la cantidad correcta de trabajadores que se usarán durante una lectura.

Go

Fuentes delimitadas

  • En tu RangeTracker, implementa el método GetProgress(). El servicio de Dataflow usa GetProgress para realizar un seguimiento del progreso de lectura y converger en la cantidad correcta de trabajadores que se usarán durante una lectura.

Limitaciones

  • En los trabajos que ejecutan Dataflow Prime, el ajuste de escala automático horizontal se desactiva durante los 10 minutos posteriores al ajuste de escala automático vertical. Para obtener más información, consulta Efecto en el ajuste de escala automático horizontal.
  • En el caso de las canalizaciones que no usan Dataflow Shuffle, es posible que Dataflow no pueda reducir la escala de los trabajadores de manera eficaz, ya que los trabajadores podrían tener datos aleatorios almacenados en discos locales.
  • La transformación PeriodicImpulse es compatible con el ajuste de escala automático de transmisión en las versiones 2.60.0 y posteriores del SDK de Apache Beam. Si tu canalización usa PeriodicImpulse con una versión anterior del SDK, los trabajadores de Dataflow no reducen la escala verticalmente como se espera.

¿Qué sigue?