Dataflow se basa en el proyecto de código abierto Apache Beam. En este documento se describe el modelo de programación de Apache Beam.
Información general
Apache Beam es un modelo unificado de código abierto que se utiliza para definir flujos de procesamiento por lotes y en streaming. El modelo de programación de Apache Beam simplifica los mecanismos del tratamiento de datos a gran escala. Con uno de los SDKs de Apache Beam, puedes crear un programa que defina el flujo de procesamiento. A continuación, ejecutas la canalización en una plataforma específica, como Dataflow. Este modelo te permite centrarte en la composición lógica de tu trabajo de procesamiento de datos en lugar de gestionar la orquestación del procesamiento paralelo.
Apache Beam te aísla de los detalles de bajo nivel del procesamiento distribuido, como la coordinación de trabajadores individuales, la fragmentación de conjuntos de datos y otras tareas similares. Dataflow gestiona por completo estos detalles de bajo nivel.
Una pipeline es un gráfico de transformaciones que se aplican a colecciones de datos. En Apache Beam, una colección se denomina PCollection
y una transformación se denomina PTransform
. Un PCollection
puede ser acotado o no acotado.
Un PCollection
delimitado tiene un tamaño fijo conocido y se puede procesar mediante una
pipeline por lotes. Los PCollections
sin límites deben usar una canalización de streaming, ya que los datos se procesan a medida que llegan.
Apache Beam proporciona conectores para leer y escribir en diferentes sistemas, incluidos servicios y tecnologías de terceros, como Apache Kafka. Google Cloud
En el siguiente diagrama se muestra una canalización de Apache Beam.
Puedes escribir PTransforms
que realicen una lógica arbitraria. Los SDKs de Apache Beam también proporcionan una biblioteca de PTransforms
útiles predefinidas, entre las que se incluyen las siguientes:
- Filtra todos los elementos que no cumplan un predicado.
- Aplica una función de asignación individual a cada elemento.
- Agrupa los elementos por clave.
- Contar los elementos de una colección
- Cuenta los elementos asociados a cada clave de una colección de pares clave-valor.
Para ejecutar una canalización de Apache Beam con Dataflow, sigue estos pasos:
- Usa el SDK de Apache Beam para definir y compilar el flujo de procesamiento. También puedes desplegar una canalización prediseñada mediante una plantilla de Dataflow.
- Usa Dataflow para ejecutar el flujo de procesamiento. Dataflow asigna un grupo de máquinas virtuales para ejecutar el trabajo, implementa el código en las máquinas virtuales y coordina la ejecución del trabajo.
- Dataflow realiza optimizaciones en el backend para que tu flujo de procesamiento se ejecute de forma eficiente y aproveche la paralelización.
- Mientras se ejecuta un trabajo y después de que se complete, usa las funciones de gestión de Dataflow para monitorizar el progreso y solucionar problemas.
Conceptos de Apache Beam
En esta sección se incluyen resúmenes de conceptos fundamentales.
Conceptos básicos
- Flujos de procesamiento
- Una canalización encapsula toda la serie de cálculos que se realizan para leer los datos de entrada, transformarlos y escribir los datos de salida. El origen de entrada y el receptor de salida pueden ser del mismo tipo o de tipos diferentes, lo que te permite convertir datos de un formato a otro. Los programas de Apache Beam empiezan construyendo un objeto
Pipeline
y, a continuación, usando ese objeto como base para crear los conjuntos de datos de la canalización. Cada flujo de trabajo representa un único trabajo repetible. - PCollection
- Un
PCollection
representa un conjunto de datos de varios elementos potencialmente distribuido que actúa como los datos de la canalización. Las transformaciones de Apache Beam usan objetosPCollection
como entradas y salidas en cada paso de tu flujo de procesamiento. UnPCollection
puede contener un conjunto de datos de tamaño fijo o un conjunto de datos ilimitado de una fuente de datos que se actualiza continuamente. - Transformaciones
- Una transformación representa una operación de procesamiento que transforma los datos. Una transformación toma uno o varios
PCollection
s como entrada, realiza una operación que especifiques en cada elemento de esa colección y genera uno o variosPCollection
s como salida. Una transformación puede realizar casi cualquier tipo de operación de procesamiento, como cálculos matemáticos con datos, convertir datos de un formato a otro, agrupar datos, leer y escribir datos, filtrar datos para obtener solo los elementos que quieras o combinar elementos de datos en valores únicos. - ParDo
ParDo
es la operación de procesamiento paralelo principal de los SDKs de Apache Beam, que invoca una función especificada por el usuario en cada uno de los elementos de la entradaPCollection
.ParDo
recoge los elementos de salida (cero o más) en una salida.PCollection
La transformaciónParDo
procesa los elementos de forma independiente y, posiblemente, en paralelo. La función definida por el usuario de unParDo
se denominaDoFn
.- E/S de flujo de procesamiento
- Los conectores de entrada/salida de Apache Beam te permiten leer datos en tu flujo de procesamiento y escribir datos de salida desde él. Un conector de E/S consta de una fuente y un sumidero. Todas las fuentes y receptores de Apache Beam son transformaciones que permiten que tu canalización trabaje con datos de varios formatos de almacenamiento de datos diferentes. También puedes escribir un conector de E/S personalizado.
- Agregación
- La agregación es el proceso de calcular un valor a partir de varios elementos de entrada. El patrón de cálculo principal de la agregación en Apache Beam consiste en agrupar todos los elementos con una clave y una ventana comunes. Después, combina cada grupo de elementos mediante una operación asociativa y conmutativa.
- Funciones definidas por el usuario (UDF)
- Algunas operaciones de Apache Beam permiten ejecutar código definido por el usuario para configurar la transformación. En el caso de
ParDo
, el código definido por el usuario especifica la operación que se debe aplicar a cada elemento, mientras que, en el caso deCombine
, especifica cómo se deben combinar los valores. Una canalización puede contener UDFs escritas en un idioma diferente al del runner. Una canalización también puede contener UDFs escritas en varios idiomas. - Runner
- Los runners son el software que acepta una canalización y la ejecuta. La mayoría de los runners son traductores o adaptadores de sistemas de procesamiento de Big Data masivamente paralelos. Hay otros runners para pruebas y depuración locales.
- Fuente
- Una transformación que lee datos de un sistema de almacenamiento externo. Un flujo de procesamiento suele leer datos de entrada de una fuente. La fuente tiene un tipo, que puede ser diferente del tipo del receptor, por lo que puedes cambiar el formato de los datos a medida que se mueven por la canalización.
- Fregadero
- Una transformación que escribe en un sistema de almacenamiento de datos externo, como un archivo o una base de datos.
- TextIO
- Un PTransform para leer y escribir archivos de texto. El origen y el receptor de TextIO admiten archivos comprimidos con
gzip
ybzip2
. La fuente de entrada TextIO admite JSON. Sin embargo, para que el servicio Dataflow pueda paralelizar la entrada y la salida, los datos de origen deben estar delimitados con un salto de línea. Puedes usar una expresión regular para orientar a archivos específicos con la fuente TextIO. Dataflow admite patrones de comodín generales. Tu expresión de carácter comodín puede aparecer en cualquier parte de la ruta. Sin embargo, Dataflow no admite comodines recursivos (**
).
Conceptos avanzados
- Hora del evento
- Hora en la que se produce un evento de datos, determinada por la marca de tiempo del elemento de datos. Esto contrasta con el tiempo que tarda en procesarse el elemento de datos real en cualquier fase de la canalización.
- Ventanas
- El ventaneo permite agrupar operaciones en colecciones ilimitadas dividiendo la colección en ventanas de colecciones finitas según las marcas de tiempo de los elementos individuales. Una función de ventana indica al runner cómo asignar elementos a una ventana inicial y cómo combinar ventanas de elementos agrupados. Apache Beam te permite definir diferentes tipos de ventanas o usar las funciones de ventana predefinidas.
- Marcas de agua
- Apache Beam monitoriza una marca de agua, que es la noción del sistema de cuándo se espera que hayan llegado al flujo de procesamiento todos los datos de una ventana determinada. Apache Beam monitoriza una marca de agua porque no se garantiza que los datos lleguen a un flujo de procesamiento en orden cronológico o a intervalos predecibles. Además, no se garantiza que los eventos de datos aparezcan en la canalización en el mismo orden en el que se generaron.
- Activador
- Los activadores determinan cuándo se deben emitir los resultados agregados a medida que llegan los datos. En el caso de los datos delimitados, los resultados se emiten después de que se hayan procesado todas las entradas. En el caso de los datos ilimitados, los resultados se emiten cuando la marca de agua supera el final de la ventana, lo que indica que el sistema cree que se han procesado todos los datos de entrada de esa ventana. Apache Beam proporciona varios activadores predefinidos y te permite combinarlos.
Siguientes pasos
- Para obtener más información sobre los conceptos básicos de la creación de flujos de procesamiento con los SDKs de Apache Beam, consulta la guía de programación de Apache Beam en la documentación de Apache Beam.
- Para obtener más información sobre las funciones de Apache Beam compatibles con Dataflow, consulta la matriz de funciones de Apache Beam.