¿Te preguntabas cuál es el servicio de procesamiento de datos y ETL para Google Cloud Platform? Con Dataflow, puedes procesar grandes cantidades de datos de manera rápida y eficiente, sin tener que preocuparte por la administración de servidores. ¡Sigue leyendo para descubrir todos los beneficios y características de este servicio!
Contenidos
¿Qué es Dataflow?
Dataflow es el servicio de procesamiento de datos serverless en Google Cloud Platform (GCP) que permite procesar y analizar grandes cantidades de datos en tiempo real o en batches de manera unificada. Es la solución estándar de ETL en Google Cloud, más moderna y ágil que alternativas como Dataproc.
Dataflow está basado en Apache Beam (proyecto open source que combina procesamiento streaming y batch, de donde viene su nombre) y permite crear flujos de trabajo para procesar, transformar y analizar datos utilizando una variedad de herramientas y lenguajes de programación.
Además de en Dataflow, los proyectos de Apache Beam pueden ser ejecutados en otros runners o ejecutores, como por ejemplo Apache Flink o Apache Spark. Otra ventaja que aporta Apache Bean es la capacidad de que cada runner funciona con cada lenguaje, por lo que se pueden implementar pipelines multi-lenguaje con transformaciones cross-language.
Además, Dataflow te permite integrar tus flujos de trabajo con otras herramientas y servicios de Google Cloud, como BigQuery y Cloud Storage a través de conectores de una manera muy sencilla, lo que proporciona una solución completa de procesamiento de datos.
Componentes de Dataflow
La arquitectura de Google Cloud Dataflow se basa en el procesamiento distribuido y consiste en varios componentes clave, como:
- Fuentes de datos: Dataflow lee datos de diferentes fuentes, como bases de datos, archivos en Google Cloud Storage o tablas de BigQuery.
- Transformaciones: Proporciona un conjunto de transformaciones que se pueden aplicar para limpiar, enriquecer y preparar los datos para su análisis.
- Flujo de trabajo: Dataflow permite crear flujos de trabajo para procesar, transformar y analizar datos en tiempo real o en lotes utilizando una variedad de lenguajes de programación, como Python o Java.
- Clusters: El procesamiento se ejecuta en clusters distribuidos de máquinas virtuales de Google Cloud. Los clusters se pueden escalar dinámicamente según las necesidades de procesamiento en cada paso independiente. No es necesario administrar ni manejar estos clusters, se hace de forma automática y transparente.
- Sinks: A igual que con las fuentes de datos, Dataflow puede escribir los resultados del procesamiento en una variedad de destinos a través de conectores.
Para tareas de desarrollo, es posible usar un Runner local, mientras que para el procesamiento de producción se usa el Cloud Runner. Beam SDK runtime environment se puede contenerizar también para aislarlo de otros runtimes.
Ventajas de Dataflow
Entre las ventajas de Dataflow, podemos destacar las siguientes características:
- Agregaciones exactly-once (cada elemento se procesará exactamente una vez, sin duplicados).
- Las pipelines, el código y las operaciones son las mismas para procesamiento en streaming y batch.
- Una pipeline es más fácil de mantener para organizar el código de procesamiento que una aplicación en una instancia.
- El autoescalado y rebalanceado ocurre a cada paso en mitad de un trabajo de forma dinámica.
- Las plantillas de Dataflow se almacenan en Cloud Storage. Esto permite que los usuarios las puedan ejecutar sin escribir código y separa los desarrolladores de pipelines de los usuarios o consumidores.
- Puede ofrecer resultados especulativos (antes de tiempo) o resultados actualizados con la capacidad de procesar eventos con retraso (allowedLateness)
Procesamiento Batch y Streaming con Dataflow
Para manejar los datos, Dataflow usa ventanas de procesamiento. Existen cuatro tipos de ventanas:
- Global: Ventana por defecto. Todos los eventos formarán parte de esta ventana.
- Fijas (Fixed): Ventana con duración fija de tamaño constante y disjuntas.
- Deslizantes (Sliding): Tienen un tamaño constante pero pueden superponerse.
- De Sesión (Session): Contiene elementos en una duración de intervalo. Esta duración es un intervalo entre los datos nuevos de una transmisión. Si los datos llegan después de la duración del intervalo, los datos se asignarán a una ventana nueva.
También gestiona las marcas de agua (watermarks). Son límites temporales que indican el retraso que lleva el sistema en el procesamiento de datos respecto al tiempo de eventos. Dicho de otra forma, si llegan datos cuya marca temporal es anterior al watermark, Dataflow los considera tardíos.
Por defecto, Dataflow determina cuando todos los datos han llegado y avanza el watermark al final de la ventana.
Los triggers o activadores determinan el momento en el que entregar los resultados del procesamiento. El trigger por defecto es «AfterWatermark», lo que indica que los resultados se entregan cuando el watermark pasa el final de la ventana. Se pueden establecer triggers por hora del elemento, por tiempo de procesamiento o por la cantidad de elementos.
Artículos Recomendados:
Flexible Resource Scheduling (FlexRS)
Esta capacidad del servicio hace que Dataflow se ejecute con coste más reducido, usando una mezcla de máquinas virtuales normales y de instancias interrumpibles (preemptible) como workers.
Este modo de ejecución solo es apropiado para cargas de trabajo que no son críticas, ya que deja el trabajo planificado y lo encola para su ejecución, que puede ser hasta 6 horas después de su creación. Cuando se planifica el trabajo, Dataflow realiza una serie de validaciones sobre los parámetros de ejecución, las configuraciones, las cuotas y los permisos. En el caso de detectar un fallo, el error se reporta inmediatamente sin esperar.
Dataflow Shuffle
Esta capacidad solo está disponible para trabajos batch, y mueve las operaciones de shuffle fuera de las máquinas worker para ejecutarlo en un servicio backend. Permite acelerar la ejecución de estos trabajos y reduce el consumo de CPU, memoria y disco persistente.
También proporciona un mejor autoescalado; las máquinas virtuales con los nodos worker no necesitan almacenar datos de shuffle, por lo que pueden ser reducidos mucho antes. Por otro lado, cuando una máquina virtual tiene un fallo, puede ser reemplazada sin que falle todo el trabajo.
Streaming engine
El igual que ocurre con el shuffle en los trabajos batch, la capacidad de streaming engine de Dataflow permite mover el almacenamiento del estado de las ventanas de procesamiento en los trabajos de streaming a un servicio backend.
Esto significa que se reduce la necesidad de discos persistentes en las máquinas virtuales a un disco mínimo de boot. Al moverse el shuffle a un servicio externo, se aumenta la eficiencia del procesamiento y se vuelve más ágil para responder ante variaciones en el volumen de datos entrantes.
También evita tener que redesplegar las pipelines para aplicar actualizaciones de servicio. Usar streaming engine en Dataflow no necesita cambios en el código.
Ejemplo de pipeline sencilla en Dataflow
En Dataflow los datos se representan en estructuras llamadas PCollections. Estas estructuras no son identicas a los RDDs de Spark, y para migrar este código debemos adaptarlo a Dataflow.
Cada paso de procesamiento es un PTransform. La combinación de PTransform forman una pipeline.
Aquí tienes un ejemplo de una pipeline sencilla en Dataflow de Google Cloud Platform (GCP) que lee un archivo de texto de Cloud Storage, cuenta la frecuencia de aparición de cada palabra y escribe los resultados en una tabla de BigQuery:
import apache_beam as beam
from apache_beam.io import ReadFromText
from apache_beam.io import WriteToBigQuery
p = beam.Pipeline()
input_file = 'gs://my-bucket/input.txt'
output_table = 'my-project:my-dataset.word_counts'
(p
| ReadFromText(input_file)
| beam.FlatMap(lambda x: x.split())
| beam.Map(lambda x: (x, 1))
| beam.CombinePerKey(sum)
| WriteToBigQuery(output_table)
)
p.run()
En este ejemplo, primero se importan las librerías necesarias y se crea un objeto de Pipeline. Luego, se define la ruta del archivo de entrada y la tabla de BigQuery de salida. La pipeline se construye utilizando una serie de operadores.
A continuación tienes ejemplos de algunos operadores comunes:
- ParDo: Permite el procesamiento paralelo, necesita que se proporcione código en forma de DoFn
- Map: Relación 1:1 entre entrada y salida
- FlatMap: Para relaciones que no son 1:1 entre entrada y salida
- GroupBy: Shuffle
- GroupByKey: Shuffle explícito por clave
- CoGroupByKey: Agrupa los resultados de varias PCollections por clave
- Combine: Agrega los valores, puede ser más eficiente que groupbykey al hacerlo antes de la fase de shuffle
- CombineGloballlyfn: Reduce una PCollection a un solo valor
- CombinePerKey: Comba los valores por una función combinada que toma una acción iterable como sum o max
- Flatten: Une PCollection idénticas (UNION)
- Partition: Divide una PCollection en un número fijo de colecciones de datos más pequeñas
Antes de usar una transformación de grupo como GroupByKey en una PCollection sin límites debes establecer una ventana de procesamiento no global o un trigger que no sea por defecto.
Aquí tienes un ejemplo de código que utiliza Apache Beam y Google Cloud Dataflow para procesar datos en paralelo:
from google.cloud import dataflow
# Define la fuente de datos
source = dataflow.io.TextIO('gs://my-bucket/input/*.csv')
# Define la transformación para procesar los datos
def process_data(record):
# Procesar los datos aquí
return record
# Aplicar la transformación a los datos en paralelo
processed_data = source | dataflow.ParDo(process_data)
# Escribir los resultados en un archivo de salida
processed_data | dataflow.io.TextIO('gs://my-bucket/output/processed.csv')
# Ejecutar la pipeline
dataflow.Pipeline().run()
En este ejemplo, se utiliza el transformador ParDo
de Apache Beam para aplicar la transformación process_data
a los datos en paralelo. Esto permite acelerar el procesamiento de datos al distribuir el trabajo entre varios nodos del cluster.
Diferencias entre Dataflow y Dataproc en Google Cloud Platform
Google Cloud Dataflow y Cloud Dataproc son dos servicios de procesamiento de datos en la nube ofrecidos por Google Cloud Platform. Aunque ambos servicios se utilizan para procesar y analizar grandes cantidades de datos, existen algunas diferencias clave entre ellos.
Dataflow utiliza Apache Beam y Spark como plataformas de procesamiento de datos, mientras que Dataproc utiliza Apache Hadoop y Spark. Por este motivo, Dataproc es la opción preferida cuando se necesitan migrar cargas de trabajo ya desarrolladas en Spark en clusters onprem. Es la opción directa llamada lift and shift (mover la aplicación y los datos sin rediseñarla ni recodificar).
En el caso de nuevos desarrollos, es aconsejable realizarlos en Dataflow, puesto que es más flexible y eficiente en procesamiento y en coste. Además, los desarrollos para Dataflow son reutilizables en un gran número de runners, como Apache Spark.
Otra diferencia importante es la forma en que se cobra cada servicio. Dataflow se cobra por el uso de recursos y tiempo de ejecución, mientras que Dataproc se cobra por el uso de clusters. Esto significa que Dataflow puede ser más adecuado para aplicaciones de procesamiento de datos que necesitan un rendimiento constante, mientras que Dataproc puede ser más adecuado para aplicaciones de procesamiento de datos que necesitan grandes cantidades de recursos de manera ocasional.
Siguientes Pasos con Dataflow y GCP
Preguntas Frecuentes Dataflow – FAQ
¿En qué lenguajes de programación se puede escribir el código para Google Dataflow?
El código para Google Dataflow se puede escribir en varios lenguajes de programación, incluyendo Java, Python y otros lenguajes que sean compatibles con Apache Beam.
¿Cómo se factura el uso de Google Dataflow?
Google Dataflow se factura según el consumo de recursos de procesamiento y almacenamiento. El coste exacto depende de la cantidad de datos procesados y del tiempo de procesamiento utilizado.
¿Cómo se pueden monitorear las operaciones en Dataflow?
Puedes usar el panel de control de Dataflow en la consola de Google Cloud Platform para ver el estado de tus trabajos de Dataflow y obtener información sobre el rendimiento y los errores.