Replicar continuamente cambios de una base de datos OLTP (p. ej., Oracle, PostgreSQL, MySQL) a BigQuery con baja latencia.
→Usar Datastream para realizar Change Data Capture (CDC). Configurar para transmitir cambios directamente a BigQuery, que los aplica utilizando su capacidad `MERGE`.
Por qué: Datastream es un servicio CDC gestionado y serverless que simplifica la replicación de bases de datos en tiempo real sin requerir pipelines personalizados o una carga significativa en la base de datos de origen.
Referencia↗
Una pipeline de streaming de Dataflow debe producir resultados precisos con ventanas de tiempo de evento a pesar de que algunos eventos lleguen horas tarde.
→Configurar ventanas de tiempo de evento con `allowedLateness` para acomodar el retraso. Usar triggers con activaciones tempranas para resultados preliminares y acumular paneles activados para incluir datos tardíos.
Por qué: El modelo de Dataflow de marcas de agua (watermarks), triggers y latencia permitida proporciona un marco robusto para equilibrar la completitud y la latencia al tratar con datos fuera de orden.
Una pipeline de Dataflow que escribe en BigQuery experimenta duplicados después de reinicios o fallas transitorias.
→Usar el sink de BigQuery Storage Write API (`STORAGE_WRITE_API`) con el método configurado en `at-least-once` (predeterminado, anteriormente `STREAMING_INSERTS`) o `exactly-once` (modo `COMMITTED`).
Por qué: La Storage Write API en modo `COMMITTED` proporciona semántica exactamente una vez incorporada para streaming, eliminando la necesidad de lógica de deduplicación personalizada.
Ingestar datos de una REST API paginada y con límite de tasa usando Dataflow.
→Usar un `SplittableDoFn` para procesar la fuente paginada en paralelo. Implementar lógica de límite de tasa (p. ej., usando un Guava RateLimiter) y retroceso exponencial para reintentos dentro del DoFn.
Por qué: Un `SplittableDoFn` permite el reequilibrio dinámico del trabajo. Combinarlo con el límite de tasa y la lógica de reintento crea un patrón resistente y eficiente para manejar APIs externas.
Un único flujo de datos necesita ser escrito en múltiples destinos (p. ej., BigQuery, Bigtable, Cloud Storage).
→En una única pipeline de Dataflow, después del procesamiento inicial, aplicar múltiples escritores `PTransform` a la misma `PCollection` final.
Por qué: El patrón de fan-out es altamente eficiente ya que los datos se procesan solo una vez. Evita el costo y la complejidad de ejecutar múltiples pipelines separadas leyendo de la misma fuente.
Un flujo de alto volumen debe ser enriquecido uniéndolo con una tabla de dimensiones de cambio lento (p. ej., perfiles de usuario) que se actualiza periódicamente.
→Usar el patrón de entrada lateral (side input) en Dataflow. Cargar la tabla de dimensiones como una `PCollectionView`. Configurar un trigger periódico para refrescar la entrada lateral según un horario, evitando reinicios de la pipeline.
Por qué: Las entradas laterales transmiten los datos de la dimensión a todos los workers para búsquedas rápidas en memoria, evitando llamadas a API/DB por elemento. La actualización periódica maneja las actualizaciones de manera eficiente.
Las cargas de trabajo del clúster de Dataproc varían significativamente, lo que lleva a un sobreaprovisionamiento o un rendimiento insuficiente.
→Crear un clúster de Dataproc con una política de autoescalado. Definir los recuentos mínimos/máximos de workers primarios y secundarios. La política escalará el clúster basándose en métricas de YARN.
Por qué: El autoescalado optimiza los costos al adaptar los recursos del clúster a la demanda del trabajo, escalando para cargas pesadas y reduciendo durante períodos de inactividad.
Una pipeline de Dataflow requiere binarios personalizados, librerías propietarias o versiones específicas no incluidas en las imágenes de worker estándar, y debe ejecutarse en una VPC sin internet.
→Construir una imagen de contenedor personalizada con todas las dependencias preinstaladas. Subir la imagen a Artifact Registry. Desplegar la pipeline usando una Flex Template que haga referencia al contenedor personalizado.
Por qué: Las Flex Templates con contenedores personalizados proporcionan control total sobre el entorno de ejecución y las dependencias, crucial para entornos offline o especializados.
Un trabajo de Dataflow o Spark que realiza un `GroupByKey` es lento porque algunas claves tienen un número desproporcionado de valores (una "clave caliente").
→Implementar una agregación en dos etapas (key salting). Primero, añadir un sufijo aleatorio a la clave para dividir la clave caliente entre múltiples workers. Agregación parcial. Segundo, eliminar el sufijo y agregar los resultados parciales.
Por qué: Esta técnica de fan-out divide manualmente el trabajo para la clave caliente, permitiendo que se procese en paralelo y superando el cuello de botella.
Una pipeline de streaming no debe fallar debido a registros mal formados. Los registros inválidos deben aislarse para su análisis sin detener el procesamiento.
→En un `DoFn`, usar un bloque try-catch para el parsing. Usar un DoFn de múltiples salidas con `TupleTag` para enrutar los registros válidos a la salida principal y los registros inválidos (con contexto de error) a una salida de error separada. Enviar la PCollection de error a un destino de dead-letter como un tema de Pub/Sub o una tabla de BigQuery.
Por qué: Este patrón proporciona resiliencia al aislar datos erróneos, prevenir fallos en la pipeline y asegurar que los registros fallidos sean capturados para depuración y reprocesamiento.