Escalamiento dinámico de subprocesos

El escalamiento dinámico de subprocesos es parte del conjunto de atributos de escalamiento vertical de Dataflow. Complementa la función de ajuste de escala automático horizontal de Dataflow mediante el ajuste de la cantidad de tareas paralelas, también conocidas como paquetes, que ejecuta cada trabajador de Dataflow. El objetivo es aumentar la eficiencia general de la canalización de Dataflow.

Cuando Dataflow ejecuta una canalización, el tratamiento de datos se distribuye en varias máquinas virtuales (VMs) de Compute Engine, también conocidas como trabajadores. Un subproceso es una única tarea ejecutable que se ejecuta dentro de un proceso más grande. Dataflow inicia varios subprocesos en cada trabajador.

Con el escalamiento dinámico de subprocesos habilitado, el servicio de Dataflow elige de forma automática la cantidad adecuada de subprocesos que se ejecutarán en cada trabajador de Dataflow. Debido a que cada subproceso ejecuta una tarea, aumentar la cantidad de subprocesos permite que se ejecuten más tareas en paralelo en un trabajador. Cuando usas esta función con la función de ajuste de escala automático horizontal, la cantidad total de subprocesos que usa la canalización sigue siendo la misma, pero se usan menos trabajadores.

El escalamiento dinámico de subprocesos usa un algoritmo para determinar cuántos subprocesos necesita cada trabajador según los indicadores de uso de recursos generados durante la ejecución de la canalización. Para obtener más información, consulta la sección Cómo funciona en esta página.

Ventajas

El escalamiento dinámico de subprocesos tiene los siguientes beneficios potenciales.

  • Permite que los trabajadores de Dataflow procesen datos de manera más eficiente mediante la mejora del uso de memoria y CPU por trabajador.
  • Mejora el procesamiento paralelo mediante el ajuste de la cantidad de subprocesos de trabajo disponibles para ejecutar tareas en paralelo durante la ejecución de la canalización.
  • Reduce la cantidad de trabajadores necesarios para procesar conjuntos de datos grandes, lo que puede reducir los costos.

Asistencia y limitaciones

  • El escalamiento dinámico de subprocesos está disponible para las canalizaciones que usan los SDK de Java, Python y Go.
  • El trabajo de Dataflow debe usar Runner v2.
  • Solo las canalizaciones por lotes son compatibles.
  • Es posible que las canalizaciones que consumen mucha memoria o CPU no se beneficien del escalamiento dinámico de subprocesos.
  • El escalamiento dinámico de subprocesos no reduce la cantidad de tiempo que lleva completar un trabajo de Dataflow.

Cómo funciona

El escalamiento dinámico de subprocesos usa principios de ajuste automático para aumentar o reducir de forma dinámica el recuento de subprocesos en cada trabajador del grupo de trabajadores de Dataflow. El recuento de subprocesos se escala de forma independiente en cada trabajador. Cada subproceso ejecuta una tarea. Aumentar la cantidad de subprocesos permite que se ejecuten más tareas en paralelo en un trabajador. A medida que se completan las tareas y ya no se necesitan los subprocesos, el recuento de subprocesos reduce la escala verticalmente. Un algoritmo determina cuántos subprocesos necesita cada trabajador.

El recuento de subprocesos en un trabajador escala verticalmente hasta un máximo de dos subprocesos por CPU virtual cuando se cumplen las siguientes condiciones:

  • El uso de memoria en el trabajador es inferior al 50%.
  • El uso de CPU en el trabajador es inferior al 65%.

El recuento de subprocesos en un trabajador reduce la escala verticalmente a un mínimo de un subproceso por CPU virtual cuando se cumple la siguiente condición:

  • El uso de memoria en el trabajador es superior al 70%.

Para ver el uso de CPU y memoria de tu trabajo, usa la pestaña Métricas del trabajo de la interfaz web de Dataflow.

Para garantizar que las recomendaciones sean válidas, Dataflow espera a que el uso de recursos se estabilice antes de enviar recomendaciones a los trabajadores. Por ejemplo, el uso de memoria y CPU puede estar en el rango de escalamiento, pero debido a que el uso de recursos sigue creciendo, Dataflow no envía una recomendación. Después de que se estabilice el uso de recursos, Dataflow envía una recomendación.

Si se produce un error por falta de memoria (OOM), el escalamiento de subprocesos se inhabilita automáticamente y la canalización se ejecuta con un subproceso por CPU virtual.

Habilitar el escalamiento dinámico de subprocesos

Para habilitar el escalamiento dinámico de subprocesos, usa la siguiente opción de servicio de Dataflow.

Java

--dataflowServiceOptions=enable_dynamic_thread_scaling

Python

--dataflow_service_options=enable_dynamic_thread_scaling

Go

--dataflow_service_options=enable_dynamic_thread_scaling

Cuando el escalamiento dinámico de subprocesos está habilitado, también puedes establecer la cantidad inicial y máxima de trabajadores disponibles para tu canalización durante la ejecución. Para obtener más información, consulta Opciones de canalización.

Verifica que el escalamiento dinámico de subprocesos esté habilitado

Cuando el escalamiento dinámico de subprocesos está habilitado, se muestra el siguiente mensaje en tus archivos de registro de trabajador:

Enabling thread vertical scaling feature in worker.

Para ver tus archivos de registro de trabajador, en el Explorador de registros, usa el panel Query filtrar los registros por Nombre del registro Usa el siguiente nombre de registro en tu filtro:

projects/PROJECT_ID/logs/dataflow.googleapis.com%2Fharness

Puedes ver la cantidad recomendada de subprocesos en los archivos de registro del trabajador. El siguiente mensaje incluye la cantidad recomendada de subprocesos:

worker_thread_scaling_report_response { recommended_thread_count: NUMBER }

Si el uso de recursos no está en el rango de escalamiento, el valor que se muestra es igual a la cantidad de CPU virtuales en el trabajador.

También puedes usar la consola de Google Cloud para ver si el escalamiento dinámico de subprocesos está habilitado. Cuando está habilitada, en el panel Información del trabajo de Dataflow, en la fila dataflowServiceOptions de la sección Opciones de canalización, se muestra enable_dynamic_thread_scaling.

Solución de problemas

En esta sección, se proporcionan instrucciones para solucionar problemas habituales relacionados con el escalamiento dinámico de subprocesos.

Degradación del rendimiento con escalamiento dinámico de subprocesos habilitado

Aumentar el recuento de subprocesos puede causar problemas de rendimiento en los siguientes casos:

  • Cuando varios procesos intentan usar el mismo recurso, un proceso puede usarlo, mientras que otros deben esperar. Esta situación se conoce como contención de recursos. Cuando se produce una contención de recursos, el rendimiento de la canalización puede disminuir.
  • Cuando se producen errores de memoria insuficiente, se inhabilita el escalamiento dinámico de subprocesos. En algunos casos, los errores por memoria insuficiente pueden hacer que la canalización falle.

Verifica si el recuento de subprocesos aumentó. Para obtener información sobre cómo verificar el recuento de subprocesos recomendado, consulta Verifica que el escalamiento de subprocesos esté habilitado en esta página.

Si el escalamiento de subprocesos está habilitado, para resolver este problema, cuando ejecutes tu canalización, no incluyas la opción de servicio de escalamiento dinámico de subprocesos.

Trabajador unificado… inhabilitado y habilitado

Después de habilitar el escalamiento dinámico de subprocesos, es posible que el trabajo falle con el siguiente error:

The workflow could not be created. Causes: (ID): Unified worker misconfigured by user and was both enabled and disabled.

Este error se produce cuando Runner v2 se inhabilita explícitamente.

Para resolver este problema, habilita Runner v2. Para obtener más información, consulta la sección Habilita Dataflow Runner v2 en la página “Usa Dataflow Runner V2”.

Actualiza tu SDK

Después de habilitar el escalamiento dinámico de subprocesos, es posible que el trabajo falle con el siguiente error:

Java

Dataflow Runner v2 requires the Apache Beam Java SDK version 2.29.0 or higher. Please upgrade your SDK and resubmit your job.

Python

Dataflow Runner v2 requires the Apache Beam SDK, version 2.21.0 or higher. Please upgrade your SDK and resubmit your job.

Este error ocurre cuando no se puede habilitar Runner v2 porque la versión del SDK no lo admite.

Para resolver este problema, usa una versión del SDK que sea compatible con Runner v2.

No se puede habilitar la función de escalamiento vertical de subprocesos

Después de habilitar el escalamiento dinámico de subprocesos, es posible que el trabajo falle con el siguiente error:

The workflow could not be created. Causes: (ID): Thread vertical scaling feature can not be enabled while number_of_worker_harness_threads is specified.

Este error ocurre cuando la canalización establece de forma explícita la cantidad de subprocesos por trabajador mediante la opción de canalización numberOfWorkerHarnessThreads o number_of_worker_harness_threads.

Para resolver este problema, quita la opción de canalización numberOfWorkerHarnessThreads o number_of_worker_harness_threads de tu canalización.