Prácticas recomendadas para optimizar los costes de Dataflow

En este documento se explican las prácticas recomendadas para optimizar las tareas de Dataflow con el objetivo de minimizar los costes. En él se explican los factores que influyen en los costes y se ofrecen técnicas para monitorizarlos y gestionarlos.

Para obtener más información sobre cómo se calculan los costes de los trabajos de Dataflow, consulta los precios de Dataflow.

Hay varios factores que pueden influir en gran medida en el coste de los trabajos:

  • Configuración del tiempo de ejecución
  • Rendimiento de los flujos de procesamiento
  • Requisitos de rendimiento del flujo de procesamiento

En las siguientes secciones se ofrecen detalles sobre cómo monitorizar los trabajos, los factores que influyen en el coste de los trabajos y sugerencias para mejorar la eficiencia de las canalizaciones.

Definir objetivos de nivel de servicio

Antes de empezar a optimizar, define los objetivos de nivel de servicio (SLOs) de tu canalización, especialmente en lo que respecta al rendimiento y la latencia. Estos requisitos te ayudarán a a sopesar las ventajas y desventajas entre el coste y otros factores.

  • Si tu canal requiere una latencia de ingestión de extremo a extremo baja, los costes del canal pueden ser más altos.
  • Si necesitas procesar datos que llegan tarde, el coste total de la canalización puede ser mayor.
  • Si tu flujo de procesamiento tiene picos de datos que deben procesarse, es posible que necesite capacidad adicional, lo que puede aumentar los costes.

Monitorizar tareas

Para determinar cómo optimizar un trabajo, primero debes entender su comportamiento. Usa las herramientas de monitorización de Dataflow para observar tu pipeline mientras se ejecuta. Después, usa esta información para mejorar el rendimiento y la eficiencia.

Monitorización de costes

Usa las siguientes técnicas para predecir y monitorizar los costes.

  • Antes de ejecutar la canalización en producción, ejecuta uno o varios trabajos más pequeños en un subconjunto de tus datos. En muchas de ellas, esta técnica puede proporcionar una estimación de costes.
  • Usa la página Coste de la interfaz de monitorización de Dataflow para supervisar el coste estimado de tus tareas. El coste estimado puede no reflejar el coste real del trabajo por varios motivos, como descuentos contractuales, pero puede proporcionar una buena base para optimizar los costes. Para obtener más información, consulta Monitorizar los costes.
  • Exporta los datos de Facturación de Cloud a BigQuery y analiza los costes en las tablas de exportación de la facturación. La exportación de datos de facturación de Cloud te permite exportar automáticamente datos de facturación detallados de Google Cloud Platform a lo largo del día a un conjunto de datos de BigQuery. Los datos de facturación incluyen el uso, las estimaciones de costes y los datos de precios.
  • Para evitar costes inesperados, crea alertas de monitorización cuando tu trabajo de Dataflow supere un umbral que definas. Para obtener más información, consulta el artículo sobre cómo usar Cloud Monitoring en las canalizaciones de Dataflow.

Monitorización de tareas

Monitoriza tus trabajos e identifica las áreas en las que puedes mejorar la eficiencia de la canalización.

  • Usa la interfaz de monitorización de tareas de Dataflow para identificar problemas en tus flujos de procesamiento. La interfaz de monitorización muestra un gráfico de trabajos y detalles de ejecución de cada canal. Ambas herramientas pueden ayudarte a comprender tu proceso y a identificar las fases lentas, las fases bloqueadas o los pasos con demasiado tiempo de espera.
  • Usa el explorador de métricas para ver métricas detalladas de las tareas de Dataflow. Puede usar métricas personalizadas para registrar datos de rendimiento. La métrica Distribution es especialmente útil para recoger datos de rendimiento.
  • En el caso de las canalizaciones que requieren un uso intensivo de la CPU, utiliza Cloud Profiler para identificar las partes del código de la canalización que consumen más recursos.
  • Usa el muestreo de datos para identificar problemas con tus datos. El muestreo de datos te permite observar los datos en cada paso de un flujo de procesamiento de Dataflow. Al mostrar las entradas y salidas reales de una tarea en curso o completada, esta información puede ayudarte a depurar problemas de tu flujo de procesamiento.
  • Personaliza el panel de control de monitorización de proyectos para mostrar los trabajos que pueden ser caros. Para obtener más información, consulta el artículo sobre cómo personalizar el panel de control de monitorización de Dataflow.

No se recomienda registrar métricas de procesamiento por elemento en las canalizaciones de gran volumen, ya que el registro está sujeto a límites y un registro excesivo puede degradar el rendimiento de los trabajos.

Optimizar la configuración del tiempo de ejecución

Los siguientes ajustes del tiempo de ejecución pueden afectar al coste:

  • Si ejecutas una tarea de streaming o una tarea por lotes
  • El servicio que usas para ejecutar el trabajo, como Streaming Engine o FlexRS
  • El tipo de máquina, el tamaño del disco y el número de GPUs de las VMs de trabajador
  • El modo de autoescalado
  • El número inicial de trabajadores y el número máximo de trabajadores
  • El modo de transmisión (modo de entrega exactamente una vez o al menos una vez)

En esta sección se describen los posibles cambios que puede hacer para optimizar su trabajo. Para determinar si estas sugerencias son adecuadas para tu carga de trabajo, ten en cuenta el diseño y los requisitos de tu canalización. No todas las sugerencias son adecuadas o útiles para todas las canalizaciones.

Antes de hacer cambios a gran escala, prueba los cambios en pequeñas canalizaciones que usen un subconjunto de tus datos. Para obtener más información, consulta la sección Realizar experimentos pequeños en trabajos grandes del artículo "Prácticas recomendadas para flujos de procesamiento por lotes grandes".

Ubicación del empleo

La mayoría de los trabajos de Dataflow interactúan con otros servicios, como almacenes de datos y sistemas de mensajería. Ten en cuenta dónde se encuentran.

  • Ejecuta el trabajo en la misma región que los recursos que utiliza.
  • Crea un segmento de Cloud Storage para almacenar los archivos de staging y temporales de las tareas en la misma región que la tarea. Para obtener más información, consulte las gcpTempLocation y las temp_location opciones de la canalización.

Ajustar los tipos de máquinas

Los siguientes ajustes en las VMs de trabajador pueden mejorar la eficiencia de los costes.

  • Ejecuta el trabajo con el tipo de máquina más pequeño que necesites. Ajusta el tipo de máquina según sea necesario en función de los requisitos de la canalización. Por ejemplo, las tareas de streaming con pipelines que requieren mucha CPU a veces se benefician de cambiar el tipo de máquina predeterminado. Para obtener más información, consulta Tipo de máquina.
  • Para las cargas de trabajo que requieren un uso intensivo de la memoria o de los recursos computacionales, usa los tipos de máquinas adecuados. Para obtener más información, consulta Puntuaciones de CoreMark de las VMs por familia.
  • Define el número inicial de trabajadores. Cuando se escala verticalmente una tarea, el trabajo se tiene que redistribuir a las nuevas VMs. Si sabes cuántos trabajadores necesitan tus tareas, puedes evitar este coste definiendo el número inicial de trabajadores. Para definir el número inicial de trabajadores, usa la opción de canalización numWorkers o num_workers.
  • Define el número máximo de trabajadores. Si asignas un valor a este parámetro, puedes limitar el coste total de tu tarea. Cuando pruebes la canalización por primera vez, empieza con un máximo relativamente bajo. A continuación, aumenta el valor hasta que sea lo suficientemente alto como para ejecutar una carga de trabajo de producción. Ten en cuenta los SLOs de tu canalización antes de definir un máximo. Para obtener más información, consulta Autoescalado horizontal.
  • Usa ajuste adecuado para personalizar los requisitos de recursos de pasos específicos de la canalización.
  • Algunas canalizaciones se benefician del uso de GPUs. Para obtener más información, consulta el artículo sobre cómo usar GPUs con Dataflow. Con el ajuste de tamaño, puedes configurar las GPUs para pasos específicos de la canalización.
  • Asegúrate de tener suficiente ancho de banda de red para acceder a los datos de tus VMs de trabajador, sobre todo cuando necesites acceder a datos locales.

Optimizar la configuración de los trabajos por lotes

En esta sección se ofrecen sugerencias para optimizar los ajustes de tiempo de ejecución de los trabajos por lotes. En las tareas por lotes, las fases de la tarea se ejecutan de forma secuencial, lo que puede afectar al rendimiento y al coste.

Usar la programación flexible de recursos

Si tu trabajo por lotes no depende del tiempo, puedes usar la programación flexible de recursos (FlexRS). FlexRS reduce los costes del procesamiento por lotes buscando el mejor momento para iniciar la tarea y, a continuación, usando una combinación de instancias de máquina virtual interrumpible y máquinas virtuales estándar. Las máquinas virtuales interrumpibles están disponibles a un precio mucho más bajo que las máquinas virtuales estándar, lo que puede reducir el coste total. Al usar una combinación de VMs estándar e interrumpibles, FlexRS ayuda a asegurar que tu canalización avance aunque Compute Engine interrumpa las VMs interrumpibles.

Evita ejecutar trabajos muy pequeños

Cuando sea posible, evita ejecutar trabajos que procesen cantidades de datos muy pequeñas. Si es posible, ejecuta menos tareas en conjuntos de datos más grandes. Poner en marcha y detener las VMs de trabajador conlleva un coste, por lo que ejecutar menos tareas con más datos puede mejorar la eficiencia.

Comprueba que Dataflow Shuffle esté habilitado. Las tareas por lotes usan Dataflow Shuffle de forma predeterminada.

Ajustar la configuración del autoescalado

De forma predeterminada, las tareas por lotes usan el escalado automático. En algunas tareas, como las de corta duración, no es necesario el autoescalado. Si crees que tu canalización no se beneficia del escalado automático, desactívalo. Para obtener más información, consulta Escalado automático horizontal.

También puedes usar el escalado dinámico de subprocesos para que Dataflow ajuste el número de subprocesos en función del uso de la CPU. También puedes definir explícitamente el número de hilos por trabajador mediante la opción de canalización numberOfWorkerHarnessThreads o number_of_worker_harness_threads si conoces el número óptimo de hilos para el trabajo.

Detener tareas de larga duración

Configura tus tareas para que se detengan automáticamente si superan un tiempo de ejecución predeterminado. Si sabes aproximadamente cuánto tiempo tarda en ejecutarse tu trabajo, usa la opción de servicio max_workflow_runtime_walltime_seconds para detenerlo automáticamente si se ejecuta durante más tiempo del esperado.

Optimizar la configuración de los trabajos de streaming

En esta sección se ofrecen sugerencias para optimizar los ajustes de tiempo de ejecución de los trabajos de streaming.

Usar Streaming Engine

Streaming Engine traslada la ejecución de la canalización de las máquinas virtuales de trabajadores al backend del servicio Dataflow para aumentar la eficiencia. Te recomendamos que uses Streaming Engine en tus trabajos de streaming.

Considera el modo de entrega al menos una vez

Dataflow admite dos modos para las tareas de streaming: el modo de entrega exactamente una vez y el modo de entrega al menos una vez. Si tu carga de trabajo puede tolerar registros duplicados, el modo al menos una vez puede reducir significativamente el coste de tu trabajo. Antes de habilitar el modo "al menos una vez", evalúa si tu canalización requiere el procesamiento exactamente una vez de los registros. Para obtener más información, consulta Configurar el modo de streaming de la canalización.

Elegir un modelo de precios

Los descuentos por compromiso de uso (CUDs) para las tareas de streaming de Dataflow ofrecen precios con descuento a cambio de tu compromiso de usar de forma continua una cantidad determinada de recursos de computación de Dataflow durante un año o más. Los descuentos por compromiso de uso de Dataflow son útiles cuando tu gasto en capacidad de computación de Dataflow para tareas de streaming implica un mínimo predecible al que puedes comprometerte durante al menos un año. Si usas CUDs, puedes reducir el coste de tus tareas de Dataflow.

También puedes usar la facturación basada en recursos. Con la facturación basada en recursos, los recursos de Streaming Engine que consume tu trabajo se miden en unidades de computación de Streaming Engine. Se te cobra por la CPU y la memoria de los trabajadores, así como por las unidades de computación de Streaming Engine.

Ajustar la configuración del autoescalado

Usa las sugerencias de autoescalado para ajustar la configuración de autoescalado. Para obtener más información, consulta Ajustar el escalado automático horizontal de las canalizaciones de streaming. En las tareas de streaming que usan Streaming Engine, puedes actualizar los ajustes de ajuste automático sin detener ni sustituir la tarea. Para obtener más información, consulta Actualización de la opción de trabajo en curso.

Si crees que tu canalización no se beneficia del escalado automático, desactívalo. Para obtener más información, consulta Escalado automático horizontal.

Si conoces el número óptimo de hilos para la tarea, define explícitamente el número de hilos por trabajador mediante la opción numberOfWorkerHarnessThreads o number_of_worker_harness_threads pipeline.

Detener tareas de larga duración

En el caso de las tareas de streaming, Dataflow vuelve a intentar procesar los elementos de trabajo fallidos indefinidamente. El trabajo no se ha terminado. Sin embargo, es posible que la tarea se detenga hasta que se solucione el problema. Crea políticas de monitorización para detectar señales de que una canalización se ha detenido, como un aumento de la latencia del sistema y una disminución de la actualidad de los datos. Implementa el registro de errores en el código de tu canalización para identificar los elementos de trabajo que fallan repetidamente.

Rendimiento de los flujos de procesamiento

Las canalizaciones que se ejecutan más rápido pueden costar menos. Los siguientes factores pueden afectar al rendimiento de la canalización:

  • El paralelismo disponible para tu trabajo
  • La eficiencia de las transformaciones, los conectores de E/S y los codificadores utilizados en la pipeline
  • La ubicación de los datos

El primer paso para mejorar el rendimiento de la canalización es comprender el modelo de procesamiento:

  • Consulta información sobre el modelo de Apache Beam y el modelo de ejecución de Apache Beam.
  • Consulta más información sobre el ciclo de vida de una canalización, incluido cómo gestiona Dataflow la paralelización y las estrategias de optimización que utiliza. Las tareas de Dataflow usan varias VMs de trabajador y cada trabajador ejecuta varios subprocesos. Los paquetes de elementos de un PCollection se distribuyen a cada subproceso de trabajador.

Sigue estas prácticas recomendadas cuando escribas el código de tu canalización:

Almacenamiento de registros

Sigue estas prácticas recomendadas al registrar eventos:

Pruebas

Probar tu canal tiene muchas ventajas, como ayudarte con las actualizaciones del SDK, la refactorización del canal y las revisiones de código. Muchas optimizaciones, como la modificación de transformaciones personalizadas que requieren un uso intensivo de la CPU, se pueden probar de forma local sin necesidad de ejecutar un trabajo en Dataflow.

Prueba las canalizaciones a gran escala con datos de prueba realistas para tu carga de trabajo, incluido el número total de elementos de las canalizaciones por lotes, el número de elementos por segundo de las canalizaciones de streaming, el tamaño de los elementos y el número de claves. Prueba tus canalizaciones de dos formas: en un estado estable y procesando un gran volumen de datos pendientes para simular una recuperación tras un fallo.

Para obtener más información sobre cómo crear pruebas unitarias, pruebas de integración y pruebas de extremo a extremo, consulta Probar una canalización. Para ver ejemplos de pruebas, consulta el repositorio de dataflow-ordered-processing GitHub.

Siguientes pasos