Canalizaciones

En los SDK de Dataflow, una canalización representa un trabajo de procesamiento de datos. Para compilar una canalización, debes escribir un programa mediante un SDK de Dataflow. Una canalización consta de un conjunto de operaciones que pueden leer una fuente de datos de entrada, transformar esos datos y escribir el resultado. Los datos y las transformaciones en una canalización son exclusivos de esa canalización y son de su propiedad. Aunque tu programa puede crear varias canalizaciones, estas no pueden compartir datos o transformaciones.

Puedes crear canalizaciones con diferentes grados de complejidad. Una canalización puede ser relativamente simple y lineal, en la que un conjunto de canalizaciones se ejecuta una después de la otra, o se puede ramificar y fusionar. De este modo, puedes considerar la canalización como un grafo dirigido de pasos, en vez de como una secuencia de pasos lineal y sencilla. La construcción de tu canalización puede crear este grafo dirigido a través del uso de condicionales, bucles y otras estructuras de programación comunes.

Nota: Cuando escribes un programa con el SDK de Dataflow, tu programa crea una especificación de la canalización. Esta especificación se envía a un ejecutor de canalizaciones, como el servicio de Cloud Dataflow o algún ejecutor de terceros. El ejecutor de la canalización ejecuta la canalización real de forma asíncrona. Una canalización también se puede ejecutar de forma local para realizar pruebas y depuraciones.

Cuando el ejecutor de actualizaciones compila tu canalización real para la ejecución distribuida, la canalización se puede optimizar. Por ejemplo, puede que resulte más eficiente, desde el punto de vista informático, ejecutar ciertas transformaciones a la vez, o en un orden diferente. El servicio de Dataflow administra completamente este aspecto de la ejecución de tu canalización.

Partes de una canalización

Una canalización consta de dos partes: los datos, y las transformaciones que se aplican a esos datos. Los SDK de Dataflow proporcionan clases que representan los datos y las transformaciones. Los SDK de Dataflow enlazan las clases de datos y las clases de transformaciones para compilar la canalización completa. Consulta Cómo compilar tu canalización y obtén una guía completa sobre cómo utilizar las clases del SDK de Dataflow para crear tu canalización.

Datos de la canalización

En los SDK de Dataflow, las canalizaciones usan una clase de colección especializada llamada PCollection para representar sus datos de entrada, intermedios y de salida. Las PCollection se pueden usar para representar conjuntos de datos de casi cualquier tamaño. Ten en cuenta que, en comparación con las clases de colección típicas, como Collection de Java, las PCollection están diseñadas específicamente para admitir el procesamiento en paralelo.

Una canalización debe crear una PCollection para cualquier dato con el que necesite trabajar. Puedes leer datos de una fuente externa en una PCollection o puedes crear una PCollection a partir de datos locales en tu programa de Dataflow. A partir de ahí, cada transformación en la canalización acepta una o más PCollection como entrada y produce una o más PCollection como salida.

Consulta PCollection para obtener un análisis detallado sobre el funcionamiento de PCollection y cómo usarla.

Transformaciones de las canalizaciones

Una transformación es un paso en la canalización. Cada transformación toma una o más PCollection como entrada, cambia o manipula los elementos de esa PCollection y produce una o más PCollection nuevas como salida.

Transformaciones básicas

Los SDK de Dataflow contienen varias transformaciones básicas. Una transformación básica es una operación genérica que representa una operación de procesamiento básica o común que realizas en los datos de la canalización. La mayoría de las transformaciones principales proporcionan un patrón de procesamiento y requieren que crees y proporciones la lógica de procesamiento real que se aplica a la entrada PCollection.

Por ejemplo, la transformación básica ParDo proporciona un patrón de procesamiento genérico: por cada elemento en la PCollection de entrada, se realiza una función de procesamiento en ese elemento, especificada por el usuario. Los SDK de Dataflow brindan transformaciones básicas, como ParDo y GroupByKey, además de otras transformaciones básicas para combinar, fusionar y dividir conjuntos de datos.

Consulta Transformaciones para obtener un análisis completo sobre cómo usar las transformaciones en una canalización.

Transformaciones compuestas

Los SDK de Dataflow admiten la combinación de varias transformaciones en transformaciones compuestas más grandes. En una transformación compuesta, se aplican múltiples transformaciones a los conjuntos de datos para realizar una operación de procesamiento de datos más compleja. Las transformaciones compuestas son una excelente forma de compilar combinaciones de transformaciones modulares y reutilizables que ejecuten tareas útiles.

Los SDK de Dataflow contienen bibliotecas de transformaciones compuestas predefinidas que manejan casos prácticos comunes de procesamiento de datos. Los siguientes son algunos de esos casos:

  • Combinación de datos, como la suma o el cálculo del promedio de los datos numéricos
  • Procesamiento de estilo Map/Shuffle/Reduce, como el conteo de elementos únicos de una colección
  • Análisis estadístico, como encontrar los elementos N principales en una recopilación

También puedes crear tu propia transformación compuesta reutilizable. Consulta Cómo crear transformaciones compuestas para obtener un análisis detallado.

Transformaciones raíz

Los SDK de Dataflow suelen usar transformaciones raíz en el comienzo de la canalización para crear una PCollection inicial. Las transformaciones raíz, por lo general, implican leer datos desde una fuente de datos externa. Consulta la E/S de la canalización para obtener más información.

Ejemplo de canalización simple

En el siguiente ejemplo, se demuestra cómo compilar y ejecutar una canalización con tres transformaciones: una que lea algunos de los datos, una que cuente los datos y una que escriba los resultados completos de la cuenta.

Nota: Consulta Construye tu canalización para obtener un análisis completo sobre cómo construir una canalización mediante las clases en los SDK de Dataflow.

Un estilo común de construcción de canalizaciones es “encadenar” las transformaciones. Para encadenar transformaciones, aplica cada transformación nueva directamente a la PCollection resultante de la transformación anterior, como se muestra en el siguiente ejemplo.

Java

  public static void main(String[] args) {
    // Create a pipeline parameterized by commandline flags.
    Pipeline p = Pipeline.create(PipelineOptionsFactory.fromArgs(args));

    p.apply(TextIO.Read.from("gs://..."))   // Read input.
     .apply(new CountWords())               // Do some processing.
     .apply(TextIO.Write.to("gs://..."));   // Write output.

    // Run the pipeline.
    p.run();
  }

En el ejemplo, la primera llamada a apply invoca una transformación raíz para crear una PCollection (en este caso, mediante la lectura de datos de un archivo). Cada llamada subsiguiente a apply se llama en cada PCollection resultante por turnos.

Nota: Ten en cuenta que el valor que muestra la cadena completa no se guarda. Esto se debe a que la llamada apply final a la transformación Write muestra un valor trivial de tipo PDone en lugar de una PCollection. Se suele ignorar PDone.