Modelo de programación de Apache Beam

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.

Diagrama de 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:

  1. 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.
  2. 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.
  3. Dataflow realiza optimizaciones en el backend para que tu flujo de procesamiento se ejecute de forma eficiente y aproveche la paralelización.
  4. 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 objetos PCollection como entradas y salidas en cada paso de tu flujo de procesamiento. Un PCollectionpuede 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 PCollections como entrada, realiza una operación que especifiques en cada elemento de esa colección y genera uno o varios PCollections 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 entrada PCollection. ParDo recoge los elementos de salida (cero o más) en una salida. PCollection La transformación ParDo procesa los elementos de forma independiente y, posiblemente, en paralelo. La función definida por el usuario de un ParDo se denomina DoFn.
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 de Combine, 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 y bzip2. 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.
Apache Beam® es una marca registrada de The Apache Software Foundation o sus filiales en Estados Unidos u otros países.