Afina el ajuste de escala automático horizontal para canalizaciones de transmisión

En las canalizaciones de transmisión con un gran volumen de datos de entrada, por lo general, hay una relación entre el costo y la latencia. Para mantener una latencia baja, Dataflow debe agregar trabajadores a medida que aumenta el volumen de tráfico. Otro factor es la rapidez con la que la canalización debe escalar verticalmente o reducirse en respuesta a los cambios en la velocidad de datos de entrada.

El escalador automático de Dataflow tiene una configuración predeterminada que es adecuada para muchas cargas de trabajo. Sin embargo, es posible que desees ajustar este comportamiento para tu situación en particular. Por ejemplo, una latencia promedio más alta podría ser aceptable para reducir costos, o tal vez quieras que Dataflow escale verticalmente más rápido en respuesta a los aumentos repentinos de tráfico.

Para optimizar el ajuste de escala automático horizontal, puedes ajustar los siguientes parámetros:

Configura el rango de ajuste de escala automático

Cuando creas un trabajo de transmisión nuevo, puedes establecer la cantidad inicial y la máxima de trabajadores. Para hacerlo, especifica las siguientes opciones de canalización:

Java

  • --numWorkers: Es la cantidad inicial de trabajadores disponibles cuando la canalización comienza a ejecutarse.
  • --maxNumWorkers: Es la cantidad máxima de trabajadores disponibles para tu canalización.

Python

  • --num_workers: Es la cantidad inicial de trabajadores disponibles cuando la canalización comienza a ejecutarse.
  • --max_num_workers: Es la cantidad máxima de trabajadores disponibles para tu canalización.

Go

  • --num_workers: Es la cantidad inicial de trabajadores disponibles cuando la canalización comienza a ejecutarse.
  • --max_num_workers: Es la cantidad máxima de trabajadores disponibles para tu canalización.

La marca --maxNumWorkers es opcional para los trabajos de transmisión que usan Streaming Engine. El valor predeterminado es 100. Para los trabajos de transmisión que no usan Streaming Engine, se requiere --maxNumWorkers cuando el ajuste de escala automático horizontal está habilitado.

El valor inicial de --maxNumWorkers también determina cuántos discos persistentes se asignan para el trabajo. Las canalizaciones se implementan con un grupo fijo de discos persistentes, cuya cantidad es igual a --maxNumWorkers. Durante la transmisión, los discos persistentes se redistribuyen de modo que cada trabajador obtenga el mismo número de discos adjuntos.

Si configuras --maxNumWorkers, asegúrate de que el valor proporcione suficientes discos para la canalización. Ten en cuenta el crecimiento futuro cuando establezcas el valor inicial. Para obtener información sobre el rendimiento de Persistent Disk, consulta Configura tu Persistent Disk y las VMs. Dataflow factura el uso de Persistent Disk y tiene cuotas de Compute Engine, incluidas las cuotas de Persistent Disk.

De forma predeterminada, la cantidad mínima de trabajadores es 1 para los trabajos de transmisión que usan Streaming Engine y (maxNumWorkers/15), redondeada hacia arriba, para los trabajos que no usan Streaming Engine.

Actualiza el rango del ajuste de escala automático

Para los trabajos que usan Streaming Engine, puedes ajustar la cantidad de trabajadores mínima y máxima sin detener ni reemplazar el trabajo. Para ajustar estos valores, usa una actualización de trabajo en tránsito. Actualiza las siguientes opciones de trabajo:

  • --min-num-workers: es la cantidad mínima de trabajadores.
  • --max-num-workers: es la cantidad máxima de trabajadores.

gcloud

Usa el comando gcloud dataflow jobs update-options:

gcloud dataflow jobs update-options \
  --region=REGION \
  --min-num-workers=MINIMUM_WORKERS \
  --max-num-workers=MAXIMUM_WORKERS \
  JOB_ID

Reemplaza lo siguiente:

  • REGION: es el ID de región del extremo regional del trabajo
  • MINIMUM_WORKERS: es la cantidad mínima de instancias de Compute Engine
  • MAXIMUM_WORKERS: es la cantidad máxima de instancias de Compute Engine
  • JOB_ID: es el ID del trabajo que se actualizará

También puedes actualizar --min-num-workers y --max-num-workers de forma individual.

REST

Usa el método projects.locations.jobs.update:

PUT https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?updateMask=runtime_updatable_params.max_num_workers,runtime_updatable_params.min_num_workers
{
  "runtime_updatable_params": {
    "min_num_workers": MINIMUM_WORKERS,
    "max_num_workers": MAXIMUM_WORKERS
  }
}

Reemplaza lo siguiente:

  • PROJECT_ID: el ID del proyecto de Google Cloud del trabajo de Dataflow
  • REGION: es el ID de región del extremo regional del trabajo
  • JOB_ID: es el ID del trabajo que se actualizará
  • MINIMUM_WORKERS: es la cantidad mínima de instancias de Compute Engine
  • MAXIMUM_WORKERS: es la cantidad máxima de instancias de Compute Engine

También puedes actualizar min_num_workers y max_num_workers de forma individual. Especifica qué parámetros actualizar en el parámetro de búsqueda updateMask e incluye los valores actualizados en el campo runtimeUpdatableParams del cuerpo de la solicitud. En el siguiente ejemplo, se actualiza min_num_workers:

PUT https://dataflow.googleapis.com/v1b3/projects/my_project/locations/us-central1/jobs/job1?updateMask=runtime_updatable_params.min_num_workers
{
  "runtime_updatable_params": {
    "min_num_workers": 5
  }
}

Para trabajos que no usan Streaming Engine, puedes reemplazar el trabajo existente por un valor actualizado de maxNumWorkers.

Si actualizas un trabajo de transmisión que no usa Streaming Engine, el trabajo actualizado tiene inhabilitado el ajuste de escala automático horizontal de forma predeterminada. Para mantener habilitado el ajuste de escala automático, especifica --autoscalingAlgorithm y --maxNumWorkers para el trabajo actualizado.

Establece la sugerencia de uso del trabajador

Dataflow usa el uso de CPU promedio como señal de cuándo aplicar el ajuste de escala automático horizontal. De forma predeterminada, Dataflow establece un uso objetivo de CPU de 0.8. Cuando el uso está fuera de este rango, Dataflow puede agregar o quitar trabajadores.

Para obtener más control sobre el comportamiento del ajuste de escala automático, puedes establecer el uso objetivo de CPU en un valor en el rango [0.1, 0.9].

  • Establece un valor de uso de CPU más bajo si quieres lograr latencias máximas más bajas. Un valor más bajo permite que Dataflow escale horizontalmente de forma más agresiva en respuesta al uso creciente de los trabajadores y reduce la escala de forma más conservadora para mejorar la estabilidad. Un valor más bajo también proporciona más espacio cuando la canalización se ejecuta en un estado estable, lo que suele generar una latencia final más baja. (La latencia final mide los tiempos de espera más largos antes de que se procese un registro nuevo).

  • Establece un valor más alto si deseas ahorrar recursos y mantener los costos más bajos cuando el tráfico tenga aumentos repentinos. Un valor más alto evita un escalamiento vertical excesivo, a expensas de una latencia más alta.

Para configurar la sugerencia de uso cuando ejecutas un trabajo que no sea de plantilla, configura la opción de servicio worker_utilization_hint. Para un trabajo de plantilla, actualiza la sugerencia de uso, ya que las opciones de servicio no son compatibles.

En el siguiente ejemplo, se muestra cómo usar worker_utilization_hint:

Java

--dataflowServiceOptions=worker_utilization_hint=TARGET_UTILIZATION

Reemplaza TARGET_UTILIZATION por un valor en el rango [0.1, 0.9].

Python

--dataflow_service_options=worker_utilization_hint=TARGET_UTILIZATION

Reemplaza TARGET_UTILIZATION por un valor en el rango [0.1, 0.9].

Go

--dataflow_service_options=worker_utilization_hint=TARGET_UTILIZATION

Reemplaza TARGET_UTILIZATION por un valor en el rango [0.1, 0.9].

Para las canalizaciones nuevas, te recomendamos que realices pruebas en cargas realistas mediante la configuración predeterminada. Luego, evalúa el comportamiento del ajuste de escala automático según se aplica a tu canalización y realiza ajustes según sea necesario.

La sugerencia de uso es solo un factor que Dataflow usa cuando decide si escalar los trabajadores. Otros factores, como las tareas pendientes y las claves disponibles, pueden anular el valor de la sugerencia. Además, la sugerencia no es un objetivo estricto. El escalador automático intenta mantener el uso de CPU dentro del rango del valor de la sugerencia, pero la métrica de uso agregado puede ser mayor o menor. Para obtener más información, consulta Heurísticas del ajuste de escala automático de transmisión.

Actualiza la sugerencia de uso

Para actualizar la sugerencia de uso mientras se ejecuta un trabajo, realiza una actualización en tránsito de la siguiente manera:

gcloud

Usa el comando de gcloud dataflow jobs update-options:

gcloud dataflow jobs update-options \
  --region=REGION \
  --worker-utilization-hint=TARGET_UTILIZATION \
  JOB_ID

Reemplaza lo siguiente:

  • REGION: es el ID de región del extremo regional del trabajo
  • JOB_ID: es el ID del trabajo que se actualizará
  • TARGET_UTILIZATION: un valor en el rango [0.1, 0.9]

Para restablecer la sugerencia de uso al valor predeterminado, usa el siguiente comando de gcloud:

gcloud dataflow jobs update-options \
  --unset-worker-utilization-hint \
  --region=REGION \
  --project=PROJECT_ID \
  JOB_ID

REST

Usa el método projects.locations.jobs.update:

PUT https://dataflow.googleapis.com/v1b3/projects/PROJECT_ID/locations/REGION/jobs/JOB_ID?updateMask=runtime_updatable_params.worker_utilization_hint
{
  "runtime_updatable_params": {
    "worker_utilization_hint": TARGET_UTILIZATION
  }
}

Reemplaza lo siguiente:

  • PROJECT_ID: es el ID del proyecto de Google Cloud del trabajo de Dataflow.
  • REGION: es el ID de región del extremo regional del trabajo.
  • JOB_ID: es el ID del trabajo que se actualizará.
  • TARGET_UTILIZATION: un valor en el rango [0.1, 0.9]

Heurísticas de ajuste de escala automático de transmisión

Para las canalizaciones de transmisión, el objetivo del ajuste de escala automático horizontal es minimizar la acumulación mientras se maximiza el uso y la capacidad de procesamiento del trabajador, además de reaccionar con rapidez a los aumentos repentinos de carga.

Dataflow tiene en cuenta varios factores cuando se afina el ajuste de escala automático, incluidos los siguientes:

  • Tareas pendientes. El tiempo estimado de las tareas pendientes se calcula a partir de la capacidad de procesamiento y de los bytes de tareas pendientes que se deben procesar desde la fuente de entrada. Una canalización se considera pendiente cuando el tiempo estimado de las tareas pendientes supera los 15 segundos.

  • Uso de CPU objetivo. El objetivo predeterminado para el uso de CPU promedio es 0.8. Puedes anular este valor.

  • Claves disponibles. Las claves son la unidad fundamental de paralelismo en Dataflow.

En algunos casos, Dataflow usa los siguientes factores para tomar decisiones sobre el ajuste de escala automático. Si estos influyen en tu trabajo, puedes ver esa información en la pestaña de métricas Ajuste de escala automático.

  • La limitación de claves usa la cantidad de claves de procesamiento que recibe el trabajo para calcular el límite de los trabajadores, ya que solo un trabajador puede procesar cada clave a la vez.

  • Estabilización de escala descendente. Si Dataflow detecta que se tomaron decisiones de ajuste de escala automático inestables, se ralentiza la velocidad de reducción de escala para mejorar la estabilidad.

  • La opción de lujo basado en CPU usa un alto uso de CPU como criterio de escalamiento vertical.

  • Para los trabajos de transmisión que no usan Streaming Engine, el escalamiento puede estar limitado por la cantidad de discos persistentes. Para obtener más información, consulta Configura el rango de ajuste de escala automático.

Escalamiento vertical. Si una canalización de transmisión queda pendiente y con paralelismo suficiente en los trabajadores durante varios minutos, Dataflow escala verticalmente. Dataflow intenta borrar las tareas pendientes en un plazo aproximado de 150 segundos después del escalamiento vertical, según la capacidad de procesamiento actual por trabajador. Si hay trabajos pendientes, pero el trabajador no tiene suficiente paralelismo para trabajadores adicionales, la canalización no escala verticalmente. (Escalar la cantidad de trabajadores más allá de la cantidad de claves disponibles para el procesamiento paralelo no ayuda a procesar las tareas pendientes más rápido).

Reducción de escala: Cuando el escalador automático decide reducir la escala, las tareas pendientes son el factor de mayor prioridad. El escalador automático busca un trabajo pendiente de no más de 15 segundos. Si el trabajo pendiente es inferior a 10 segundos y el uso promedio de los trabajadores es inferior al objetivo de uso de CPU, Dataflow reduce la escala verticalmente. Siempre que el trabajo pendiente sea aceptable, el escalador automático intenta mantener el uso de CPU cerca del uso de CPU objetivo. Sin embargo, si el uso ya se encuentra lo suficientemente cerca del objetivo, el escalador automático puede mantener la cantidad de trabajadores sin modificar, ya que cada paso de reducción de escala tiene un costo.

Streaming Engine también usa una técnica de ajuste de escala automático predictivo basado en las tareas pendientes del temporizador. Los datos no delimitados en una canalización de transmisión se dividen en períodos agrupados por marcas de tiempo. Al final de un período, los temporizadores se activan por cada clave que se procesa en ese período. La activación de un temporizador indica que caducó el período para una clave determinada. Streaming Engine puede medir el trabajo pendiente del temporizador y predecir cuántos temporizadores se activarán al final de un período. Mediante el uso de las tareas pendientes del temporizador como un indicador, Dataflow puede estimar la cantidad de procesamiento que debe ocurrir cuando se activan los temporizadores futuros. Según la carga futura estimada, Dataflow escala de forma automática con anticipación para satisfacer la demanda esperada.

Métricas

Para encontrar los límites actuales del ajuste de escala automático de un trabajo, consulta las siguientes métricas:

  • job/max_worker_instances_limit: es la cantidad máxima de trabajadores.
  • job/min_worker_instances_limit: es la cantidad mínima de trabajadores.

Para obtener información sobre el uso de trabajadores, consulta las siguientes métricas:

  • job/aggregated_worker_utilization: el uso agregado de trabajadores.
  • job/worker_utilization_hint: la sugerencia actual de uso de trabajadores.

Para obtener estadísticas sobre el comportamiento del escalador automático, consulta la siguiente métrica:

  • job.worker_utilization_hint_is_actively_used: indica si el escalador automático usa de forma activa la sugerencia de uso del trabajador. Si otros factores anulan la sugerencia cuando se muestrea esta métrica, el valor será false.
  • job/horizontal_worker_scaling: Describe las decisiones que tomó el escalador automático. Esta métrica contiene las siguientes etiquetas:
    • direction: especifica si el escalador automático aumentó la escala, la redujo o no realizó ninguna acción.
    • rationale: especifica la lógica de la decisión del escalador automático.

Para obtener más información, consulta los Precios de Cloud Monitoring. Estas métricas también se muestran en los gráficos de supervisión del ajuste de escala automático.

¿Qué sigue?