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étodogetEstimatedSizeBytes
. El servicio de Dataflow usagetEstimatedSizeBytes
cuando calcula la cantidad inicial de trabajadores para usar en la canalización. - En la subclase
BoundedReader
, implementa el métodogetFractionConsumed
. El servicio de Dataflow usagetFractionConsumed
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étodoestimate_size
. El servicio de Dataflow usaestimate_size
cuando calcula la cantidad inicial de trabajadores para usar en la canalización. - En la subclase
RangeTracker
, implementa el métodofraction_consumed
. El servicio de Dataflow usafraction_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étodoGetProgress()
. El servicio de Dataflow usaGetProgress
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
no es compatible con el ajuste de escala automático de transmisión. Si tu canalización usa
PeriodicImpulse
, entonces los trabajadores de Dataflow no reducen la escala verticalmente como se espera.
¿Qué sigue?
- Afina el ajuste de escala automático horizontal para canalizaciones de transmisión
- Supervisa el ajuste de escala automático de Dataflow
- Soluciona problemas de ajuste de escala automático de Dataflow