Soluciona problemas de cuellos de botella en Dataflow

Un cuello de botella se produce cuando un paso, una etapa o un trabajador ralentiza el trabajo general. Los cuellos de botella pueden provocar que los trabajadores estén inactivos y que aumente la latencia.

Si Dataflow detecta un cuello de botella, el gráfico de trabajo muestra una alerta y el panelInformación del paso indica el tipo de cuello de botella y la causa, si se conoce. Dataflow también exporta información de detección de cuellos de botella a una métrica de Stackdriver, que presenta los datos como una serie temporal. Esto te permite ver los cuellos de botella a lo largo del tiempo o en el pasado.

Información sobre los cuellos de botella

Cuando Dataflow ejecuta una canalización de transmisión, el trabajo consta de una serie de componentes, como reorganizaciones de transmisión, subprocesos de procesamiento de función definida por el usuario (DoFn) y puntos de control de estado persistente. Para facilitar el flujo de datos, Dataflow usa colas para conectar estos componentes. Los datos se envían de la transmisión ascendente a la descendente.

En muchas canalizaciones, la capacidad de procesamiento general está limitada por un solo componente, lo que crea un cuello de botella en la canalización. La velocidad a la que los datos pueden atravesar un cuello de botella limita la rapidez con la que la canalización puede aceptar y procesar datos de entrada.

Por ejemplo, considera una canalización en la que el procesamiento de DoFn se produce en sentido descendente de una reorganización de transmisión. Una cola entre ellos almacena en búfer los datos reorganizados, pero sin procesar. Si el procesamiento de DoFn no puede consumir datos tan rápido como los produce la reorganización de transmisión, la cola crece. Un cuello de botella prolongado puede hacer que la cola alcance su capacidad. En ese punto, se pausa la reorganización adicional y las tareas pendientes se propagan en sentido ascendente. Las colas más arriba también acumulan tareas pendientes, lo que, finalmente, provoca una ralentización que se extiende a la fuente de datos, lo que significa que toda la canalización no puede seguir el ritmo de la entrada.

Cuando se produce un cuello de botella, una parte importante de la canalización puede parecer que no está en buen estado, aunque un solo punto de la canalización esté causando las tareas pendientes. Este comportamiento puede dificultar la depuración de los cuellos de botella. El objetivo de la detección de cuellos de botella es identificar la ubicación y la causa precisas, lo que elimina las conjeturas, para que puedas corregir la causa raíz.

Dataflow detecta un cuello de botella cuando una demora supera el umbral de cinco minutos. Si la demora no supera este umbral, Dataflow no detecta un cuello de botella.

La detección de cuellos de botella no siempre requiere que actúes y depende de tu caso de uso. Una canalización puede funcionar con normalidad con demoras transitorias de más de cinco minutos. Si esto es aceptable para tu caso de uso, es posible que no necesites resolver los cuellos de botella indicados.

Tipos de cuellos de botella

Cuando Dataflow detecta un cuello de botella, la interfaz de supervisión indica la gravedad del problema. Los cuellos de botella se dividen en las siguientes categorías:

El procesamiento se atascó y no avanza
El progreso de la canalización se detiene por completo en este paso.
El procesamiento está en curso, pero se está retrasando.
La canalización no puede procesar los datos entrantes tan rápido como llegan. Como resultado, las tareas pendientes están aumentando.
El procesamiento está en curso, pero las tareas pendientes son constantes
La canalización está progresando y la tasa de procesamiento es comparable a la tasa de entrada. El procesamiento es lo suficientemente rápido como para que las tareas pendientes no aumenten, pero las tareas pendientes acumuladas tampoco disminuyen de manera significativa.
El procesamiento está en curso y se está poniendo al día con las tareas pendientes
Las tareas pendientes están disminuyendo, pero el cuello de botella actual impide que la canalización se ponga al día más rápido. Si inicias una canalización con tareas pendientes, este estado podría ser normal y no requerir ninguna intervención. Supervisa el progreso para ver si las tareas pendientes siguen disminuyendo.

Causas de los cuellos de botella

En esta sección, se enumeran las causas de los cuellos de botella que se pueden detectar. Usa esta información para resolver el problema. En algunos casos, pueden presentarse varias causas, y es posible que estén relacionadas. Por ejemplo, si los trabajadores tienen un aprovisionamiento insuficiente, el uso de CPU virtuales podría ser alto. El uso alto de CPU virtuales puede hacer que las operaciones se ralenticen, lo que, a su vez, puede crear una demora elevada en la cola. El análisis de la causa probable puede mostrar todas estas como las causas del cuello de botella.

Operaciones con tiempo de procesamiento largo

Algunas operaciones de este cálculo tienen un tiempo de procesamiento largo. Esto ocurre cuando se envía un paquete de entrada al trabajador que ejecuta la DoFn y transcurre un tiempo significativo sin que haya resultados disponibles.

Por lo general, esto es el resultado de una sola operación de larga duración en el código de usuario. Otros problemas pueden manifestarse como operaciones con tiempo de procesamiento largo. Por ejemplo, los errores que se arrojan y se reintentan dentro de la DoFn, los reintentos durante períodos prolongados o las fallas del agente de trabajo debido a factores como los errores de memoria insuficiente pueden causar estos tiempos de procesamiento largos.

Si el cálculo afectado está en el código de usuario, busca formas de optimizar el código o limitar el tiempo de ejecución. Para ayudar con la depuración, los registros de trabajador muestran seguimientos de pila para cualquier operación que esté atascada durante más de 5 minutos.

La confirmación de claves es demasiado grande

Consulta la excepción La confirmación de claves es demasiado grande.

Tiempo de procesamiento largo en todas las operaciones

Las operaciones de este cálculo tardan mucho tiempo de manera constante, lo que sugiere un problema dentro de la DoFn proporcionada por el usuario.

Esta causa es diferente de las operaciones con tiempo de procesamiento largo. Mientras que esa causa afecta a algunas operaciones, esta causa indica que todas las operaciones de este cálculo se ven afectadas.

Revisa los registros de trabajador para detectar errores, excepciones o seguimientos de pila que indiquen subprocesos lentos o atascados. Si usas el SDK de Apache Beam para Python y las operaciones son inherentemente de larga duración por diseño (por ejemplo, llamadas lentas a la API externa o E/S de alta latencia), considera usar una DoFn asíncrona. Esta función puede mejorar la capacidad de procesamiento, ya que evita que el procesamiento se bloquee en estas tareas de larga duración.

Lectura lenta de estado persistente

El cálculo dedica una cantidad significativa de tiempo a leer el estado persistente como parte de la ejecución de la DoFn. Esto puede ser el resultado de un estado persistente excesivamente grande o de demasiadas lecturas. Considera reducir el tamaño del estado persistente o la frecuencia de las lecturas. También puede ser un problema transitorio debido a la lentitud del estado persistente subyacente.

Escritura lenta de estado persistente

El cálculo dedica una cantidad significativa de tiempo a escribir el estado persistente durante la confirmación de los resultados del procesamiento. Esto puede ser el resultado de un estado persistente excesivamente grande. Considera reducir el tamaño del estado persistente. También puede ser un problema transitorio debido a la lentitud del estado persistente subyacente.

Confirmación rechazada

No se puede confirmar el procesamiento de datos en el estado persistente porque no es válido. Por lo general, esto se debe a que se excedió uno de los límites operativos. Consulta los registros para obtener más detalles o comunícate con el equipo de asistencia.

Particiones de fuente de Apache Kafka insuficientes

El cálculo de la fuente de Apache Kafka tiene particiones insuficientes. Para resolver este problema, prueba lo siguiente:

  • Aumenta la cantidad de particiones de Kafka.
  • Incluye la redistribución con .withRedistribute() cuando configures la lectura de E/S de Kafka para paralelizar los datos de manera más eficiente. Incluye .withRedistributeNumKeys(N) donde N > partitions para proporcionar un límite superior en la cantidad total de claves. Tener una cantidad limitada de claves proporciona eficiencia a través de la agrupación de registros.
  • Para minimizar el costo de la reorganización de redistribución, usa .withOffsetDeduplication(). Este modo minimiza la cantidad de datos que deben persistir como parte de la reorganización, al tiempo que proporciona un procesamiento de exactamente una vez.

Para obtener más información, consulta Paralelismo en la página Lee desde Apache Kafka a Dataflow.

Fuente de Apache Kafka con gran volumen de estado persistente

El cálculo de la fuente de Apache Kafka está redistribuyendo un gran volumen de datos que podría generar una latencia y un costo elevados. Para resolver este problema, prueba lo siguiente:

  • Si se requiere un procesamiento de exactamente una vez para la canalización, minimiza el costo de la reorganización de redistribución mediante el uso del modo de anulación de duplicación de compensación. Este modo minimiza la cantidad de datos que deben persistir como parte de la reorganización, al tiempo que proporciona un procesamiento de exactamente una vez.
  • Si el procesamiento de al menos una vez es suficiente para la canalización, se puede habilitar la configuración de permitir duplicados.

Para obtener más información, consulta Lee desde Apache Kafka a Dataflow.

Paralelismo de fuente insuficiente

Un cálculo de fuente tiene un paralelismo insuficiente. Si es posible, aumenta la paralelización dentro de la fuente. Si no puedes aumentar la paralelización y el trabajo usa el modo de al menos una vez, intenta agregar una transformación Redistribute a la canalización.

Claves populares o paralelismo de claves insuficiente

El trabajo tiene claves populares o paralelismo de claves insuficiente.

Para cada clave de fragmentación, Dataflow procesa los mensajes de forma serial. Mientras Dataflow procesa un lote de mensajes para una clave determinada, los otros mensajes entrantes para esa clave se ponen en cola hasta que se completa el lote actual.

Si Dataflow no puede procesar suficientes claves distintas en paralelo, puede causar un cuello de botella. Por ejemplo, es posible que los datos tengan muy pocas claves distintas o que ciertas claves estén sobrerrepresentadas en los datos ("claves populares"). Para obtener más información, incluido cómo ver qué claves son populares, consulta Soluciona problemas de trabajos de transmisión lentos o atascados.

CPUs virtuales con aprovisionamiento insuficiente

El trabajo no tiene suficientes CPUs virtuales de trabajador. Esta situación ocurre cuando el trabajo ya se escaló al máximo, el uso de CPU virtuales es alto y aún hay tareas pendientes. Es posible que debas aumentar la cantidad máxima de trabajadores aprovisionados para este trabajo. Por ejemplo, puedes aumentar este número con una actualización del rango de ajuste de escala automático. Como alternativa, busca formas en las que se pueda disminuir el uso de CPU virtuales mediante cambios en el código de canalización o la carga de trabajo. Puedes usar Cloud Profiler para buscar oportunidades de optimización.

Uso alto de CPU virtual, esperando la mejora

El trabajo tiene un uso alto de CPU virtuales, pero hay espacio para escalar verticalmente. Es probable que esta condición sea transitoria hasta que se pueda realizar el escalamiento vertical. Puedes supervisar el ajuste de escala automático para ver las decisiones de ajuste de escala automático. Si esta condición persiste durante mucho tiempo o ocurre con frecuencia, es posible que debas cambiar la configuración de ajuste de escala automático estableciendo una sugerencia de uso de trabajador diferente para permitir que el trabajo escale verticalmente de forma más proactiva.

Carga de CPU virtuales desequilibrada que crea cuellos de botella en algunos trabajadores atípicos

El trabajo tiene suficientes CPUs virtuales de trabajador, pero algunos trabajadores muestran un uso muy alto de CPU virtuales. Esto suele deberse a una distribución desigual del trabajo. Entre las posibles causas, se incluyen las particiones de origen cargadas de manera desigual o las claves populares.

Para resolver este problema, prueba lo siguiente:

  • Determina la causa de la carga desigual y trata de corregirla. Por ejemplo, asegúrate de que las particiones de origen estén distribuidas de manera uniforme.
  • Si no es posible corregir la carga desigual, considera cambiar la forma de la VM de trabajador para aumentar las CPUs virtuales por trabajador y disminuir el uso máximo. Para obtener más información sobre la configuración de CPUs virtuales por trabajador, consulta Configura las VMs de trabajador de Dataflow.
Problema de comunicación con los trabajadores

Dataflow no puede comunicarse con todas las VMs de trabajador. Verifica el estado de las VMs de trabajador del trabajo. Las siguientes son algunas de las posibles causas:

  • Hay un problema con el aprovisionamiento de las VMs de trabajador.
  • Se borra el grupo de VM de trabajador mientras se ejecuta el trabajo.
  • Problemas de red.
La fuente de Pub/Sub tiene errores de extracción.

Hay errores al extraer de la fuente de Pub/Sub. Verifica que existan el tema y las suscripciones requeridos, y verifica la cuota y la configuración. También puedes revisar los registros en busca de errores.

Fuente de Pub/Sub con paralelismo insuficiente

El cálculo de la fuente de Pub/Sub tiene una cantidad insuficiente de claves de Pub/Sub. Para aumentar la cantidad de claves, establece la opción de servicio num_pubsub_keys. Para obtener más información, consulta Paralelismo de fuente de Pub/Sub.

Limitación de fuente de Pub/Sub por un motivo desconocido

El cálculo de la fuente de Pub/Sub se limita mientras se lee desde Pub/Sub, por un motivo desconocido. Este problema puede ser transitorio. Verifica si hay problemas de configuración de Pub/Sub, permisos de IAM faltantes o límites de cuota. Sin embargo, si ninguna de las áreas anteriores es la causa raíz y el problema persiste, comunícate con el equipo de asistencia.

Publicación del receptor de Pub/Sub lenta o atascada

El cálculo del receptor de Pub/Sub es lento o está atascado. Este problema puede deberse a un problema de configuración o a un límite de cuota.

Tiempo de cola de trabajo alto

La antigüedad del trabajo apto más antiguo es alta debido a una gran cantidad de claves y a la velocidad a la que se procesan las claves. En esta situación, es posible que cada operación no sea anormalmente larga, pero la demora general en la cola es alta.

Dataflow usa un solo subproceso de procesamiento por clave de fragmentación, y la cantidad de subprocesos de procesamiento es limitada. La demora en la cola es aproximadamente igual a la proporción de claves a subprocesos, multiplicada por la latencia en el subproceso para cada paquete de procesamiento de una clave:

(key count / total harness threads) * latency per bundle

Puedes probar las siguientes soluciones:

Hay un problema transitorio con el backend de Streaming Engine

Hay un problema de configuración o de operación con el backend de Streaming Engine. Este problema puede ser transitorio. Si el problema persiste, comunícate con el equipo de asistencia.

Una causa indeterminada

No se puede determinar con certeza la causa de las tareas pendientes. Este problema puede ser transitorio. Si el problema persiste, comunícate con el equipo de asistencia.

Métricas de cuellos de botella

Las siguientes métricas de trabajo proporcionan información sobre los cuellos de botella:

  • job/is_bottleneck: Indica si una etapa específica de la canalización de Dataflow es un cuello de botella, junto con su tipo y la causa probable.

  • job/backlogged_keys: La cantidad de claves pendientes para una etapa de cuello de botella.

  • job/recommended_parallelism: El paralelismo recomendado para una etapa para reducir el cuello de botella.

¿Qué sigue?