Principios de diseño de la canalización

En esta página, se explica cómo diseñar tu canalización de Google Cloud Dataflow. Se incluye información sobre cómo determinar la estructura de la canalización, cómo elegir qué transformaciones aplicar a tus datos y cómo determinar tus métodos de entrada y salida.

Antes de leer esta sección, recomendamos que te familiarices con la información sobre el modelo de programación de Cloud Dataflow, que incluye Canalizaciones, PCollections, Transformaciones y E/S de la canalización.

Qué tener en cuenta cuando diseñas tu canalización

Cuando diseñas tu canalización de Cloud Dataflow, ten en cuenta las siguientes cuestiones básicas:

  • ¿Dónde están almacenados tus datos de entrada? ¿Cuántos conjuntos de datos de entrada tienes? Eso determinará qué tipos de transformaciones de lectura necesitas aplicar al comienzo de tu canalización.
  • ¿Cómo se ven tus datos? Por ejemplo, pueden ser archivos texto simple, archivos de registro con formato o filas de una tabla de BigQuery. Algunas transformaciones de Dataflow funcionan exclusivamente en PCollection de pares clave-valor; deberás determinar si tus datos están vinculados y de qué manera y cómo representarlos de la mejor manera posible en las PCollection de tu canalización.
  • ¿Qué quieres hacer con tus datos? Las transformaciones de núcleo en los SDK de Dataflow son de uso general, y la manera en la que cambias o manipulas tus datos determinará cómo compilar las transformaciones de núcleo como ParDo o cuándo usar transformaciones escritas con anterioridad incluidas en los SDK de Dataflow.
  • ¿Cómo se ven tus datos de salida y dónde deben ir? Eso determinará qué tipos de transformaciones de escritura necesitas aplicar al final de tu canalización.

Una canalización básica

Las canalizaciones más simples representan un flujo lineal de operaciones, como se muestra a continuación en la Figura 1:

Figura 1: Una canalización lineal.

Sin embargo, tu canalización puede ser más compleja. Una canalización representa un grafo acíclico dirigido de pasos. Puede tener varias fuentes de entrada, varios receptores de salida y sus operaciones (transformaciones) pueden generar varias PCollection.

Diferentes formas de canalizaciones

En los ejemplos siguientes, se muestran algunas de las formas que puede tomar la canalización.

Ramifica PCollections

Es importante comprender que las transformaciones no consumen PCollection. En su lugar, consideran cada elemento individual de una PCollection y crean una PCollection nueva como resultado. De esta manera, puedes hacer diferentes cosas con diferentes elementos en la misma PCollection.

Las diferentes transformaciones procesan la misma PCollection

Puedes usar la misma PCollection como entrada para varias transformaciones sin consumir la entrada o alterarla.

La canalización que se ilustra en la Figura 2 a continuación lee tu entrada, los nombres (strings), de una sola fuente, Google BigQuery, y crea una PCollection de filas de tablas de BigQuery. Luego, la canalización aplica varias transformaciones a la misma PCollection. La transformación A extrae todos los nombres de esa PCollection que comienzan con la letra “A”, y la transformación B extrae todos los nombres de esa PCollection que comienzan con la letra “B”. Ambas transformaciones, A y B, tienen la misma PCollection de entrada.

Figura 2: Una canalización con varias transformaciones. Ten en cuenta que son dos las transformaciones que procesan que la PCollection de las filas de la tabla de BigQuery.

Una transformación que usa salidas laterales

Otra forma de ramificar una canalización es tener una salida única de transformación a varias PCollection mediante el uso de salidas adicionales. Las transformaciones que usan salidas adicionales procesan cada elemento de la entrada una vez y te permiten generar cero o más PCollection.

En la Figura 3 a continuación, se ilustra el mismo ejemplo descrito antes, pero con una transformación que usa una salida adicional; los nombres que comienzan con “A” se agregan a la PCollection de salida y los nombres que comienzan con “B” a la salida adicional de PCollection.

Figura 3: Una canalización con una transformación que genera varias PCollections.

La canalización en la Figura 2 contiene dos transformaciones que procesan los elementos en la misma PCollection de entrada. Una transformación usa el siguiente patrón de lógica:

if (starts with 'A') { outputToPCollectionA }

mientras que la otra transformación usa:

if (starts with 'B') { outputToPCollectionB }

Como cada transformación lee toda la PCollection de entrada, cada elemento de PCollection se procesa dos veces.

La canalización que se muestra en la Figura 3 realiza la misma operación de una manera diferente, con solo una transformación que usa la lógica

if (starts with 'A') { outputToPCollectionA } else if (starts with 'B') { outputToPCollectionB }

donde cada elemento en la PCollection de entrada se procesa una vez.

Puedes usar cualquiera de los dos mecanismos para producir varias PCollection de salida. Sin embargo, el uso de salidas adicionales es más conveniente si el procesamiento por elemento de la transformación requiere mucho tiempo.

Combina PCollections

A menudo, después de que hayas ramificado tu PCollection en varias PCollection mediante varias transformaciones, deberás combinar algunas o todas las PCollection resultantes. Puedes hacerlo con uno de los siguientes métodos:

  • Acoplar: Puedes usar la transformación Flatten en el SDK de Dataflow para combinar varias PCollection del mismo tipo.
  • Unir: Puedes usar la transformación CoGroupByKey en el SDK de Dataflow para realizar una unión relacional entre dos PCollection. Las PCollection deben estar vinculadas (es decir, deben ser colecciones de pares clave-valor) y deben usar el mismo tipo de clave.

El ejemplo que se muestra debajo en la Figura 4 es una continuación del ejemplo que se ilustró en la Figura 2 de la sección anterior. Después de ramificarse en dos PCollection, una con nombres que comienzan con “A” y otra con los que comienzan con “B”, la canalización combina las dos en una sola PCollection que ahora contiene todos los nombres que comienzan con “A” o “B”. Aquí, es más conveniente usar Flatten debido a que las PCollection que se combinan contienen el mismo tipo.

Figura 4: Parte de una canalización que combina varias PCollections.

Varias fuentes

Tu canalización puede leer su entrada de una o más fuentes. Si tu canalización lee de fuentes múltiples y los datos de esas fuentes están relacionados, te será útil unir las entradas. En el ejemplo que se ilustra a continuación en la Figura 5, la canalización lee nombres y direcciones de BigQuery y nombres y números de pedidos de Google Cloud Storage. Luego, usa CoGroupByKey para unir esta información, donde la clave es el nombre. La PCollection resultante contiene todas las combinaciones de nombres, direcciones y pedidos.

Figura 5: Una canalización con varias fuentes de entrada.

¿Qué sigue?