Diseña para la flexibilidad y la eficiencia en Dataflow

En este documento, se explica el diseño para la flexibilidad y la eficiencia (DFE), un conjunto de prácticas recomendadas de arquitectura para compilar canalizaciones de Dataflow resilientes.

La transición de restricciones de infraestructura rígidas a definiciones de recursos flexibles te ayuda a hacer lo siguiente:

  • Maximizar la obtención de recursos de procesamiento
  • Garantiza un ajuste de escala automático continuo durante los períodos de alta demanda regional.
  • Evita los retrasos en el lanzamiento de la canalización y elimina los cuellos de botella de capacidad.

Por ejemplo, en lugar de restringir tu canalización a un tipo de máquina específico en una zona, como requerir trabajadores n1-standard-4 en us-central1-a, puedes establecer necesidades mínimas de recursos (como 4 CPU virtuales y 16 GB de RAM). Si us-central1-a o la serie de máquinas N1 experimentan limitaciones de capacidad temporales, Dataflow puede aprovisionar automáticamente VMs de trabajador compatibles en otras zonas y familias de máquinas (como E2, N2 o N2D). Esta flexibilidad ayuda a garantizar que tu canalización comience y se escale sin esperar un solo grupo de hardware restringido.

Este documento está dirigido a ingenieros de datos, arquitectos de la nube y administradores de plataformas que administran cargas de trabajo de Dataflow y desean optimizar la confiabilidad, la capacidad de procesamiento y la disponibilidad de la infraestructura de las canalizaciones.

Descripción general del DFE

Dataflow es un servicio de procesamiento de datos sin servidores y completamente administrado que aprovisiona de forma dinámica instancias de máquina virtual (VM) de Compute Engine para ejecutar canalizaciones de Apache Beam. En las canalizaciones de transmisión y procesamiento por lotes a gran escala, los grupos de trabajadores suelen escalar verticalmente hasta abarcar docenas o cientos de instancias de VM.

Las canalizaciones configuradas con restricciones de infraestructura rígidas son susceptibles a demoras en el aprovisionamiento durante los períodos de alta demanda. Estos son algunos ejemplos de restricciones rígidas:

  • Codificar de forma rígida un solo tipo de máquina, como n1-standard-4
  • Fijar la canalización a una zona específica de Compute Engine

Si ese tipo de máquina o zona específicos experimentan una demanda alta temporal, Dataflow no podrá asignar recursos de procesamiento. Esto puede causar retrasos en el aprovisionamiento o errores como ZONE_RESOURCE_POOL_EXHAUSTED o RESOURCE_POOL_EXHAUSTED.

Usar los principios del DFE te ayuda a cambiar la arquitectura de tu canalización de declaraciones de infraestructura estáticas y rígidas a definiciones de recursos flexibles y basadas en requisitos. Esta flexibilidad permite que Dataflow distribuya de forma dinámica la capacidad de procesamiento en diversos grupos de hardware disponibles en Google Cloud, lo que te ayuda a maximizar la disponibilidad de la capacidad de procesamiento y, al mismo tiempo, minimizar la sobrecarga operativa.

Prácticas recomendadas para el DFE

Adopta las siguientes prácticas recomendadas para maximizar la disponibilidad de la capacidad de procesamiento, mejorar la capacidad de respuesta del ajuste de escala automático y crear canalizaciones resilientes.

Habilita la selección automática de la VM

En lugar de codificar de forma rígida un tipo de máquina estático con la opción de canalización tipo de máquina del trabajador, usa Selección automática de VM con sugerencias de recursos de Apache Beam. Cuando especificas requisitos mínimos de recursos (min_ram o cpu_count), Dataflow habilita automáticamente la flexibilidad de instancias y aprovisiona trabajadores a partir de una lista de tipos de máquinas compatibles.

Compatibilidad con cargas de trabajo:

  • Canalizaciones por lotes: El ajuste adecuado y la selección automática de VM se habilitan automáticamente cuando especificas sugerencias de recursos.
  • Canalizaciones de transmisión: El ajuste correcto requiere que se establezca la opción de canalización --experiments=enable_streaming_rightfitting, junto con el ajuste de escala automático horizontal (habilitado de forma predeterminada) y Streaming Engine (--enable_streaming_engine).

Para configurar la selección automática de VMs, especifica los requisitos mínimos de recursos (min_ram o cpu_count) a nivel de la canalización con opciones de línea de comandos, opciones de canalización del SDK o parámetros de ejecución de la plantilla de Flex. Para obtener instrucciones de configuración detalladas y ejemplos de código para Java y Python, consulta Cómo usar sugerencias de recursos.

Usa la colocación regional de trabajadores (evita la fijación zonal)

Configura Dataflow para programar de forma dinámica VMs de trabajador en cualquier zona en buen estado dentro de la región que elijas.

Especifica la opción de canalización --region y omite --zone y --worker_zone. Por ejemplo:

--region=us-central1

Desacopla el estado y la aleatorización con servicios administrados

Las canalizaciones que no usan servicios de backend administrados ejecutan operaciones de datos de reproducción aleatoria y almacenamiento de estado de transmisión directamente en los discos y la memoria de las VM de trabajador. Este acoplamiento estrecho requiere discos de trabajador más grandes y vincula la supervivencia de la carga de trabajo a instancias de VM específicas, lo que dificulta el reemplazo de trabajadores durante las restricciones de capacidad.

  • Para trabajos por lotes, usa Dataflow Shuffle: Dataflow Shuffle está habilitado de forma predeterminada para las canalizaciones por lotes que se ejecutan en tipos de máquinas de trabajador compatibles y descarga las operaciones de Shuffle de las VMs de trabajador a un servicio de backend dedicado administrado por Google.
  • Para los trabajos de transmisión, usa Streaming Engine: Streaming Engine descarga el almacenamiento del estado de la ventana y la administración del temporizador de las VMs de trabajador a una infraestructura de backend especializada y altamente responsiva. Para las canalizaciones que usan el SDK de Apache Beam 2.30.0 o posterior, Streaming Engine está habilitado de forma predeterminada. Para habilitarlo de forma explícita, pasa la opción de canalización --enable_streaming_engine.

Usa la programación flexible de recursos (FlexRS) para canalizaciones por lotes

Para las cargas de trabajo por lotes que no son urgentes, como ETL nocturno, transferencia de datos a data lakes o resúmenes diarios, usa la programación flexible de recursos (FlexRS).

Para habilitar FlexRS, configura la opción de canalización del objetivo de FlexRS:

  • Para las canalizaciones de Python: --flexrs_goal=COST_OPTIMIZED
  • Para canalizaciones de Java: --flexRSGoal=COST_OPTIMIZED

Configura tipos de VM de selector flexibles para las plantillas de Flex

Cuando se inician canalizaciones con plantillas de Flex, la VM de inicio de la canalización se establece de forma predeterminada en e2-standard-2. La VM predeterminada funciona en la mayoría de los casos, pero, si experimentas limitaciones de capacidad, puedes personalizar la configuración con la opción --launcher-machine-type cuando ejecutes el comando gcloud dataflow flex-template run:

gcloud dataflow flex-template run my-job \
    --template-file-gcs-location="gs://my-bucket/template.json" \
    --region="us-central1" \
    --launcher-machine-type="n2-standard-2"

Consideraciones y compensaciones operativas

Si bien la adopción de las prácticas recomendadas del DFE mejora significativamente la disponibilidad de la capacidad de procesamiento, la capacidad de respuesta del ajuste de escala automático y la confiabilidad operativa, considera los siguientes factores operativos y compensaciones cuando diseñes tu arquitectura:

Consideraciones sobre la selección automática de VMs

  • Confiabilidad en comparación con el rendimiento máximo: La selección automática de VMs prioriza la confiabilidad del inicio de los trabajos y la disponibilidad de procesamiento por sobre el rendimiento máximo de la ejecución. Dado que Dataflow aprovisiona desde varias familias de máquinas candidatas (como E2, N2, N4 y N2D), el rendimiento y la capacidad de procesamiento del tiempo de ejecución pueden variar ligeramente según la familia de máquinas que se aprovisione. Para las cargas de trabajo con uso intensivo de procesamiento y con estrictos ANS de ejecución, prueba tu canalización con la selección automática de VM para establecer un valor de referencia del rendimiento antes de implementarla de forma generalizada. Si una carga de trabajo requiere una plataforma de hardware o una velocidad de reloj específicas, y puedes tolerar las restricciones de capacidad, puedes seguir configurando un tipo de máquina específico.
  • Cuota de Compute Engine en las familias candidatas: Dado que la selección automática de VM puede aprovisionar trabajadores de varias familias de máquinas candidatas, asegúrate de que tu proyecto Google Cloud tenga suficiente cuota de CPU virtuales y memoria de Compute Engine para cada familia candidata en tu región de destino. Si se produce una escasez de capacidad en la familia principal y tu proyecto no tiene cuota para la familia de respaldo, el aprovisionamiento de trabajadores falla con un error QUOTA_EXCEEDED.
  • Requisito previo de la canalización de transmisión: Para las canalizaciones de transmisión, el ajuste adecuado y la selección automática de VM no están habilitados de forma predeterminada. Debes especificar --experiments=enable_streaming_rightfitting de forma explícita y asegurarte de que Streaming Engine (--enable_streaming_engine) y el ajuste de escala automático horizontal estén activos.
  • Exclusiones de configuración: La selección automática de VM se omite automáticamente o no se admite si configuras alguna de las funciones u opciones de la siguiente tabla:

    Función Opción de configuración o marca Notas
    Tipos de máquinas explícitos --worker_machine_type o --machine_type (Python)
    --workerMachineType (Java)
    Se omite la selección automática de la VM en favor del tipo de máquina especificado.
    Tipos de discos personalizados, IOPS aprovisionadas o capacidad de procesamiento --disk_type, --disk_provisioned_iops o --disk_provisioned_throughput_mibps Se omite la selección automática de la VM. Se admite la configuración de un tamaño de disco personalizado con --disk_size_gb.
    Plataformas de CPU mínimas --min_cpu_platform (Python)
    --minCpuPlatform (Java)
    Si se configura una plataforma de CPU mínima, se omite la selección automática de VMs.
    Confidential VM --experiments=enable_confidential_compute Las instancias de Confidential VM no son compatibles con la selección automática de VM.
    Aceleradores de GPU o TPU Sugerencia de recurso --dataflow_service_options=worker_accelerator=... o accelerator La selección automática de VMs solo se aplica a las cargas de trabajo sin aceleradores.
    Dataflow Prime --dataflow_service_options=enable_prime Dataflow Prime usa el ajuste de escala automático vertical y el ajuste dinámico adecuado en lugar de la selección automática de VMs.
    Programación flexible de recursos (FlexRS) --flexrs_goal=COST_OPTIMIZED (Python)
    --flexRSGoal=COST_OPTIMIZED (Java)
    FlexRS administra su propio grupo de trabajadores y búfer de programación.

Compensaciones de la programación flexible de recursos (FlexRS)

  • Período de demora en la programación: FlexRS puede introducir un búfer de programación de hasta 6 horas antes de que comience la ejecución del trabajo. No uses FlexRS para canalizaciones con ANS estrictos de tiempo de finalización o dependencias posteriores ajustadas.

Ubicación regional y localidad de los datos

  • Requisito previo del servicio administrado: La colocación regional de trabajadores solo es compatible con los trabajos que usan Dataflow Shuffle para lotes o Streaming Engine para transmisión. Los trabajos que no usan estos servicios de backend administrados utilizan la colocación automática de zonas, que selecciona una sola zona óptima dentro de la región.
  • Localidad de los datos y salida entre regiones: La ubicación regional distribuye los trabajadores en las zonas disponibles dentro de la región que elegiste. Para minimizar la latencia de la red y evitar los cargos de salida de red entre regiones, asegúrate de que todas las fuentes y los receptores de datos (como los buckets de Cloud Storage, los conjuntos de datos de BigQuery y los temas de Pub/Sub) residan en la misma región que tu trabajo de Dataflow.

Reservas de Compute Engine

  • Afinidad de reserva: Los trabajos de Dataflow a pedido consumen automáticamente las reservas de Compute Engine coincidentes que usan la afinidad de reserva ANY. Sin embargo, la selección automática de VM no admite el consumo de instancias de reservas con nombres específicos.
  • Idoneidad para cargas de trabajo transitorias: Por lo general, no se recomiendan las reservas de Compute Engine para cargas de trabajo por lotes de corta duración, con ajuste de escala automático o propensas a aumentos repentinos. Además, la creación de reservas nuevas durante una escasez zonal activa falla con las mismas restricciones de capacidad que la creación de VM según demanda.

¿Qué sigue?