Transformaciones

En una canalización de Dataflow, una transformación es un paso o una operación de procesamiento que transforma los datos. Una transformación puede realizar casi cualquier tipo de operación de procesamiento, incluidos los cálculos matemáticos de datos, la conversión de datos de un formato a otro, la agrupación de datos, la lectura y escritura de datos, el filtro de datos para mostrar solo aquellos elementos que desees o la combinación de elementos de datos en valores únicos.

Las transformaciones en el modelo de Dataflow pueden estar anidadas: las transformaciones pueden invocar y contener otras transformaciones, y así formar transformaciones compuestas.

Cómo funcionan las transformaciones

Las transformaciones representan la lógica de procesamiento de tu canalización. Cada transformación acepta una (o varias) PCollection como entrada, realiza una operación sobre los elementos de las PCollection de entrada y genera una (o varias) PCollection nuevas como salida.

Java

Para utilizar una transformación, debes realizar una llamada al método apply en la PCollection de entrada. Esto permitirá que se aplique la transformación en la PCollection de entrada que quieres procesar. Cuando realizas una llamada a PCollection.apply, se pasa la transformación que se quiere utilizar como un argumento. El resultado de PCollection es el valor de retorno de PCollection.apply.

En el siguiente código de ejemplo, se muestra cómo hacer que se aplique una transformación definida por el usuario, llamada ComputeWordLengths, a una PCollection<String> a través del método apply. ComputeWordLengths muestra una PCollection<Integer> nueva que contiene la longitud de cada String de la colección de entrada:

  // The input PCollection of word strings.
  PCollection<String> words = ...;

  // The ComputeWordLengths transform, which takes a PCollection of Strings as input and
  // returns a PCollection of Integers as output.
  static class ComputeWordLengths
      extends PTransform<PCollection<String>, PCollection<Integer>> { ... }

  // Apply ComputeWordLengths, capturing the results as the PCollection wordLengths.
  PCollection<Integer> wordLengths = words.apply(new ComputeWordLengths());

Cuando compilas una canalización con un programa de Dataflow, puede que las transformaciones incluidas no se ejecuten en el orden especificado. El servicio administrado de Cloud Dataflow, por ejemplo, realiza ejecuciones optimizadas. En las ejecuciones optimizadas, el servicio de Dataflow ordena las transformaciones en orden de dependencia; infiere la secuencia exacta desde las entradas y salidas definidas en tu canalización. Algunas transformaciones se pueden fusionar o ejecutar en orden diferente para brindar la ejecución más eficiente.

Tipos de transformaciones en los SDK de Dataflow

Transformaciones básicas

El SDK de Dataflow contiene un grupo pequeño de transformaciones básicas que constituyen la base del modelo de procesamiento en paralelo de Cloud Dataflow. Las transformaciones básicas constituyen los cimientos del procesamiento de la canalización. Cada transformación básica brinda un marco de trabajo de procesamiento genérico para aplicar la lógica empresarial que otorgas a los elementos de una PCollection.

Cuando utilizas una transformación básica, proporcionas la lógica de procesamiento como un objeto de la función. La función que proporcionas se aplica a los elementos de las PCollection de entrada. Puede que las instancias de la función se ejecuten en paralelo a través de varias instancias de Google Compute Engine, si es que hay un conjunto de datos lo suficientemente grande y optimizaciones pendientes realizadas por el servicio de ejecución de canalización. La función del código de trabajador genera los elementos de salida, si corresponde, que se agregan a las PCollection de salida.

Requisitos para los objetos de la función provistos por el usuario

Es posible que los objetos de la función que provees para una transformación tengan muchas copias en ejecución en paralelo, a través de varias instancias de Compute Engine en tu proyecto de Cloud Platform. Por eso, debes considerar los siguientes factores cuando crees esta función:

  • Tu objeto de la función debe ser serializable.
  • Tu objeto de la función debe ser compatible con subprocesos. Ten en cuenta que los SDK de Dataflow no son seguros para los subprocesos.
  • Te recomendamos que hagas que tu objeto de la función sea idempotente.

Estos requisitos se aplican a las subclases de DoFn (utilizadas con la transformación básica ParDo); CombineFn (utilizada con la transformación básica Combine), y WindowFn (utilizada con la transformación Window).

Serialización

El objeto de la función que provees en una transformación básica debe ser completamente serializable. Las clases de base para un código de usuario, como DoFn, CombineFn y WindowFn, ya implementan Serializable. Sin embargo, tu subclase no debe agregar ningún miembro no serializable.

A continuación, se muestran algunos otros factores de serialización que debes considerar:

  • Los campos transitorios en el objeto de la función no se transfieren a las instancias de trabajador de tu proyecto de Cloud Platform, ya que no se serializan de forma automática.
  • Evita cargar grandes cantidades de datos en un campo antes de la serialización.
  • Las instancias individuales de los objetos de la función no pueden compartir datos.
  • Cambiar un objeto de la función después de que se aplica no produce ningún efecto.
  • Ten cuidado cuando declares tu objeto de la función integrado a través de una instancia de clase interna anónima. En un contexto no estático, tu instancia de clase interna contendrá, de forma implícita, un puntero hacia la clase delimitante y su estado. Esa clase delimitante también será serializada y, por ende, se aplicarán a la clase externa las mismas consideraciones que se aplican al objeto de la función.
Compatibilidad con los subprocesos

Tu objeto de la función debe ser compatible con los subprocesos. A cada instancia de tu objeto de la función accede un único subproceso de la instancia de trabajador, a menos que crees, de forma explícita, tus propios subprocesos. Sin embargo, ten en cuenta que los SDK de Dataflow no son seguros para los subprocesos. Si creas tus propios subprocesos en el objeto de la función, también debes otorgar tu propia sincronización. Ten en cuenta que los miembros estáticos no se transfieren a las instancias de trabajador, y que se puede acceder a las diferentes instancias de tu función desde distintos subprocesos.

Idempotencia

Te recomendamos que hagas que tu objeto de la función sea idempotente, es decir, que para cualquier entrada tu función siempre proporcione la misma salida. La idempotencia no es obligatoria, pero si tus funciones son idempotentes, tus resultados serán deterministas. Esto permite que la depuración y la solución de problemas sean más sencillas.

Tipos de transformaciones básicas

Utilizarás con frecuencia las transformaciones básicas directamente en tu canalización. Además, muchas de las otras transformaciones provistas en el SDK de Dataflow están implementadas desde el punto de vista de las transformaciones básicas.

Los SDK de Dataflow definen las siguientes transformaciones básicas:

  • ParDo para el procesamiento genérico en paralelo
  • GroupByKey para agrupar por claves los pares clave-valor
  • Combine para combinar colecciones o valores agrupados
  • Flatten para fusionar colecciones

Transformaciones compuestas

Los SDK de Dataflow admiten transformaciones compuestas, que son aquellas compiladas a partir de varias subtransformaciones. El modelo de transformaciones en los SDK de Dataflow es modular, en el sentido de que puedes compilar una transformación que se implementó desde el punto de vista de otras transformaciones. Puedes imaginar una transformación compuesta como un paso complejo de tu canalización que contiene varios pasos anidados.

Las transformaciones compuestas sirven para crear una operación que se repite y que incluye varios pasos. Muchas de las transformaciones integradas en los SDK de Dataflow, como Count y Top, son de este tipo de transformación compuesta. Se utilizan de la misma manera que cualquier otra transformación.

Consulta Cómo crear transformaciones compuestas para obtener más información.

Transformaciones predefinidas en el SDK de Dataflow

Los SDK de Dataflow te otorgan varias transformaciones predefinidas, que son transformaciones básicas y compuestas en las que ya escribiste la lógica de procesamiento. Estas son transformaciones más complejas, que sirven para combinar, dividir, manipular y realizar análisis estadísticos de los datos.

Java

Puedes encontrar estas transformaciones en el paquete com.google.cloud.dataflow.sdk.transforms y sus subpaquetes.

Para ver un análisis sobre cómo utilizar las transformaciones provistas en los SDK de Dataflow, consulta Transformaciones incluidas en los SDK.

Transformaciones raíz para la lectura y escritura de datos

Los SDK de Dataflow otorgan transformaciones especializadas, llamadas transformaciones raíz, que sirven para ingresar y extraer datos de tu canalización. Estas transformaciones se pueden utilizar en cualquier momento de tu canalización, pero, por lo general, funcionan como la raíz y los extremos de tu canalización. Incluyen transformaciones de lectura, transformaciones de escritura y transformaciones de creación.

Las transformaciones de lectura, que pueden funcionar como la raíz de tu canalización cuando se crea una PCollection inicial, se utilizan para crear datos de canalización desde varias fuentes. Entre estas fuentes se incluyen los archivos de texto de Google Cloud Storage, los datos almacenados en BigQuery o Pub/Sub, y otras fuentes de almacenamiento en la nube. Los SDK de Dataflow también otorgan una API extensible para trabajar con tus propias fuentes de datos personalizadas.

Las transformaciones de escritura pueden funcionar como extremos de la canalización para escribir PCollection que contengan datos de salida procesados hacia un almacenamiento externo. Entre los receptores de almacenamiento de datos externos, se incluyen los archivos de texto de Google Cloud Storage, las tablas de BigQuery, Pub/Sub, o algún otro mecanismo de almacenamiento en la nube.

Las transformaciones de creación sirven para crear una PCollection a partir de datos en la memoria. Consulta Cómo crear una PCollection para obtener más información.

Para obtener más información sobre las transformaciones de lectura y escritura, consulta E/S de canalización.

Transformaciones con varias entradas y salidas

Algunas transformaciones aceptan varias entradas de PCollection o entradas complementarias especializadas. Una transformación también puede producir varias salidas de PCollection y salidas complementarias. Los SDK de Dataflow te brindan una API de etiquetado para realizar un seguimiento y pasar varias entradas y salidas de diferentes tipos.

Para obtener más información sobre las transformaciones con varias entradas y salidas, y los detalles del sistema de etiquetado, consulta Cómo manejar varias PCollections.

¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.