El autoescalado horizontal permite que Dataflow elija el número adecuado de instancias de trabajador para tu tarea, añadiendo o quitando trabajadores según sea necesario. Dataflow se escala en función del uso medio de CPU de los trabajadores y del paralelismo de una canalización. El paralelismo de una canalización es una estimación del número de subprocesos necesarios para procesar los datos de forma más eficiente en un momento dado.
El autoescalado horizontal se admite tanto en los flujos de procesamiento por lotes como en los de streaming.
Autoescalado por lotes
El escalado automático horizontal está habilitado de forma predeterminada en todas las canalizaciones por lotes. Dataflow elige automáticamente el número de trabajadores en función de la cantidad total estimada de trabajo en cada fase de tu canalización. Esta estimación depende del tamaño de la entrada y del rendimiento actual. Cada 30 segundos, Dataflow vuelve a evaluar la cantidad de trabajo en función del progreso de la ejecución. A medida que aumenta o disminuye la cantidad total de trabajo estimada, Dataflow aumenta o reduce de forma dinámica el número de trabajadores.
El número de trabajadores es sublineal a la cantidad de trabajo. Por ejemplo, un trabajo que requiere el doble de esfuerzo tiene menos del doble de trabajadores.
Si se da alguna de las siguientes condiciones, Dataflow mantiene o reduce el número de trabajadores para ahorrar recursos inactivos:
- El uso medio de CPU de los trabajadores es inferior al 5%.
- El paralelismo está limitado debido a tareas que no se pueden paralelizar, como datos que no se pueden dividir debido a archivos comprimidos o módulos de E/S que no se dividen.
- El grado de paralelismo es fijo, por ejemplo, al escribir en archivos de Cloud Storage.
Para definir un límite superior en el número de trabajadores, define la --maxNumWorkers
opción de flujo de procesamiento.
El valor predeterminado es 2,000
.
Para definir un límite inferior en el número de trabajadores, define la opción de servicio --dataflow-service-options=min_num_workers
.
Estas marcas son opcionales.
Autoescalado de streaming
En las tareas de streaming, el autoescalado horizontal permite que Dataflow cambie de forma adaptativa el número de trabajadores en respuesta a los cambios en la carga y el uso de recursos.
El autoescalado horizontal está habilitado de forma predeterminada en las tareas de streaming que usan Streaming Engine. Para habilitar el autoescalado horizontal en las tareas de streaming que no usan Streaming Engine, define las siguientes opciones de flujo de procesamiento al iniciar el flujo de procesamiento:
Java
--autoscalingAlgorithm=THROUGHPUT_BASED
--maxNumWorkers=MAX_WORKERS
Sustituye MAX_WORKERS por el número máximo de instancias de trabajador.
Python
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Sustituye MAX_WORKERS por el número máximo de instancias de trabajador.
Go
--autoscaling_algorithm=THROUGHPUT_BASED
--max_num_workers=MAX_WORKERS
Sustituye MAX_WORKERS por el número máximo de instancias de trabajador.
Para definir un límite inferior en el número de trabajadores, define la opción de servicio --dataflow-service-options=min_num_workers
.
Cuando defines este valor, el escalado automático horizontal no se reduce por debajo del número de trabajadores especificado. Esta marca es opcional.
Mientras se ejecuta un trabajo de streaming, puedes actualizar el número mínimo y máximo de trabajadores mediante una actualización del trabajo en curso.
Para ajustar la configuración, define las marcas min-num-workers
y max-num-workers
.
Para obtener más información, consulta Actualizar el intervalo de autoescalado.
Inhabilitar el autoescalado horizontal
Para inhabilitar el autoescalado horizontal, define la siguiente opción de canalización al ejecutar el trabajo.
Java
--autoscalingAlgorithm=NONE
Si inhabilitas el autoescalado horizontal, Dataflow definirá el número de trabajadores en función de la opción --numWorkers
.
Python
--autoscaling_algorithm=NONE
Si inhabilitas el autoescalado horizontal, Dataflow definirá el número de trabajadores en función de la opción --num_workers
.
Go
--autoscaling_algorithm=NONE
Si inhabilitas el autoescalado horizontal, Dataflow definirá el número de trabajadores en función de la opción --num_workers
.
Fuentes personalizadas
Si crea una fuente de datos personalizada, puede mejorar el rendimiento implementando métodos que proporcionen más información al algoritmo de escalado automático horizontal:
Java
Fuentes acotadas
- En tu subclase
BoundedSource
, implementa el métodogetEstimatedSizeBytes
. El servicio Dataflow usagetEstimatedSizeBytes
para calcular el número inicial de trabajadores que se usarán en tu canalización. - En tu subclase
BoundedReader
, implementa el métodogetFractionConsumed
. El servicio Dataflow usagetFractionConsumed
para monitorizar el progreso de lectura y converger en el número correcto de trabajadores que se deben usar durante una lectura.
Fuentes ilimitadas
La fuente debe informar al servicio Dataflow sobre el trabajo pendiente.
El backlog es una estimación de la entrada en bytes que aún no ha procesado la fuente. Para informar al servicio sobre el trabajo pendiente, implementa uno de los siguientes métodos en tu clase UnboundedReader
.
getSplitBacklogBytes()
: trabajo pendiente de la división actual de la fuente. El servicio agrega el trabajo pendiente de todas las divisiones.getTotalBacklogBytes()
: la cartera de pedidos global de todas las divisiones. En algunos casos, el backlog no está disponible para cada división y solo se puede calcular en todas las divisiones. Solo la primera división (ID de división "0") debe proporcionar el backlog total.
El repositorio de Apache Beam contiene varios ejemplos de fuentes personalizadas que implementan la clase UnboundedReader
.
Python
Fuentes acotadas
- En tu subclase
BoundedSource
, implementa el métodoestimate_size
. El servicio Dataflow usaestimate_size
al calcular el número inicial de trabajadores que se usarán en tu canalización. - En tu subclase
RangeTracker
, implementa el métodofraction_consumed
. El servicio Dataflow usafraction_consumed
para monitorizar el progreso de lectura y converger en el número correcto de trabajadores que se deben usar durante una lectura.
Go
Fuentes acotadas
- En
RangeTracker
, implementa el métodoGetProgress()
. El servicio Dataflow usaGetProgress
para monitorizar el progreso de lectura y converger en el número correcto de trabajadores que se deben usar durante una lectura.
Limitaciones
- En los trabajos que ejecutan Dataflow Prime, el autoescalado horizontal se desactiva durante el autoescalado vertical y hasta 10 minutos después. Para obtener más información, consulta Efecto en el autoescalado horizontal.
- En las canalizaciones que no usan Dataflow Shuffle, es posible que Dataflow no pueda reducir el número de trabajadores de forma eficaz porque estos pueden tener datos aleatorios almacenados en discos locales.
- La transformación PeriodicImpulse se admite con el ajuste de escala automático de streaming 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 se reducirán como se espera.
Siguientes pasos
- Ajustar el autoescalado horizontal de las canalizaciones de streaming
- Monitorizar el autoescalado de Dataflow
- Solucionar problemas del autoescalado de Dataflow