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 lastemp_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
onum_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.
- Para monitorizar los errores de las canalizaciones, consulta Número de registros de errores del trabajador.
- Para solucionar errores, consulta el artículo Solucionar errores de Dataflow.
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:
- Cuando sea posible, usa la versión del SDK de Apache Beam más reciente. Consulta las notas de la versión para conocer los cambios de las diferentes versiones.
- Sigue las prácticas recomendadas para escribir código de la canalización.
- Sigue las prácticas recomendadas para conectores de E/S.
- En el caso de las canalizaciones de Python, considera la posibilidad de usar contenedores personalizados. El preempaquetado de las dependencias reduce el tiempo de inicio de los trabajadores.
Almacenamiento de registros
Sigue estas prácticas recomendadas al registrar eventos:
- Un registro excesivo puede afectar al rendimiento.
- Para reducir el volumen de los registros, puedes cambiar el nivel de registro de la canalización. Para obtener más información, consulta Controlar el volumen de los registros.
- No registre elementos individuales. Habilite el muestreo de datos.
- Usa un patrón de letra muerta para los errores de cada elemento, en lugar de registrar cada error.
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
- Planificar un flujo de procesamiento de Dataflow
- Desarrollar y probar flujos de procesamiento de datos de Dataflow
- Solucionar problemas con las canalizaciones