Transformations

Dans un pipeline Dataflow, une transformation représente une étape ou une opération de traitement qui transforme des données. Une transformation peut effectuer quasiment tout type de traitement, y compris effectuer des calculs mathématiques sur des données, convertir des données d'un format à un autre, regrouper des données, lire et écrire des données, filtrer des données pour en extraire certains éléments, ou encore combiner des éléments de données en valeurs uniques.

Dans le modèle Dataflow, les transformations peuvent être imbriquées, c'est-à-dire que les transformations peuvent contenir et appeler d'autres transformations, formant ainsi des transformations composites.

Fonctionnement des transformations

Les transformations représentent la logique de traitement de votre pipeline. Chaque transformation accepte une (ou plusieurs) PCollection(s) en entrée, réalise une opération sur les éléments de la/des PCollection(s) d'entrée et génère une (ou plusieurs) nouvelle(s) PCollection(s) en sortie.

Java

Pour utiliser une transformation, vous l'appliquez à la PCollection d'entrée que vous souhaitez traiter en appelant la méthode apply sur la PCollection d'entrée. Lorsque vous appelez PCollection.apply, vous lui passez comme argument la transformation que vous souhaitez utiliser. La PCollection de sortie est la valeur de renvoi de PCollection.apply.

Ainsi, l'exemple de code suivant montre comment utiliser apply avec une transformation définie par l'utilisateur appelée ComputeWordLengths pour traiter une PCollection<String>. ComputeWordLengths renvoie une nouvelle PCollection<Integer> contenant la longueur de chaque String de la collection d'entrée :

  // 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());

Lorsque vous créez un pipeline dans le cadre d'un programme Dataflow, les transformations que vous y intégrez ne sont pas forcément exécutées précisément dans l'ordre spécifié. En effet, par exemple, le service géré Cloud Dataflow réalise une exécution optimisée. Dans le cadre d'une exécution optimisée, le service Dataflow ordonne les transformations suivant un ordre de dépendance en déduisant la séquence exacte à partir des entrées et des sorties définies dans votre pipeline. Certaines transformations peuvent être fusionnées ou exécutées dans un ordre différent pour assurer l'exécution la plus efficace.

Types de transformations dans le SDK Dataflow

Transformations de base

Le SDK Dataflow comporte un petit groupe de transformations de base qui constituent les fondations du modèle de traitement parallèle de Cloud Dataflow. Les transformations de base sont les composants essentiels du traitement réalisé dans le pipeline. Chaque transformation de base fournit un framework de traitement générique permettant d'appliquer la logique métier que vous fournissez aux éléments d'une PCollection.

Lorsque vous utilisez une transformation de base, vous fournissez la logique de traitement en tant qu'objet fonction. La fonction que vous fournissez est appliquée aux éléments de la/des PCollection(s) d’entrée. Les instances de la fonction peuvent être exécutées en parallèle sur plusieurs instances de Google Compute Engine, pour peu que l'ensemble de données soit assez grand et tant que les optimisations réalisées par le service de gestion du pipeline ne sont pas encore actives. La fonction du code de calcul génère, le cas échéant, les éléments de sortie qui sont ajoutés à la/aux PCollection(s) de sortie.

Conditions requises pour les objets fonction fournis par l'utilisateur

Les objets fonction que vous fournissez à une transformation peuvent être exécutés en plusieurs copies parallèles sur plusieurs instances Compute Engine au sein de votre projet Cloud Platform. De ce fait, il y a certains facteurs dont vous devez tenir compte lorsque vous créez une telle fonction :

  • Votre objet fonction doit être sérialisable.
  • Votre objet fonction doit être compatible avec les threads et vous devez savoir que les SDK Dataflow ne sont pas sécurisés.
  • Nous vous recommandons de rendre votre objet fonction idempotent.

Ces exigences s'appliquent aux sous-classes de DoFn (utilisée avec la transformation de base ParDo), de CombineFn (utilisée avec la transformation de base Combine) et de WindowFn (utilisée avec la transformation Window).

Sérialisabilité

L'objet fonction que vous fournissez à une transformation de base doit être entièrement sérialisable. Les classes de base du code utilisateur, telles que DoFn, CombineFn et WindowFn, sont déjà mises en œuvre sous forme Serializable. Toutefois, votre sous-classe ne doit pas ajouter de membres non sérialisables.

Quelques facteurs supplémentaires de sérialisabilité dont vous devez tenir compte :

  • Les champs transitoires dans votre objet fonction ne sont pas transmis aux instances de nœuds de calcul dans votre projet Cloud Platform, car ils ne sont pas automatiquement sérialisés.
  • Évitez de charger de grandes quantités de données dans un champ avant la sérialisation.
  • Les instances individuelles d'objets fonction ne peuvent pas partager de données.
  • La mutation d'un objet fonction après son application n'a aucun effet.
  • Soyez prudent lorsque vous déclarez votre objet fonction de manière intégrée en utilisant une instance de classe interne anonyme. Dans un contexte non statique, votre instance de classe interne contiendra implicitement un pointeur vers la classe englobante et son état. Cette classe englobante sera également sérialisée, et les considérations qui s'appliquent à l'objet fonction lui-même s'appliqueront donc également à cette classe externe.
Compatibilité avec les threads

Votre objet fonction doit être compatible avec les threads. À moins que vous ne créiez explicitement vos propres threads, un seul thread sur une instance de nœud de calcul accède à chaque instance de votre objet fonction. Notez cependant que les SDK Dataflow ne sont pas sécurisés. Si vous créez vos propres threads dans votre objet fonction, vous devez fournir votre propre synchronisation. Notez que les membres statiques ne sont pas transmis aux instances de calcul et que vous pouvez accéder à plusieurs instances de votre fonction à partir de différents threads.

Idempotence

Nous vous recommandons de rendre votre objet fonction idempotent, c'est-à-dire que, pour une entrée donnée, votre fonction fournit toujours le même résultat. L'idempotence n'est pas une exigence, mais créer des fonctions idempotentes rend votre sortie déterministe et peut ainsi faciliter le débogage et le dépannage de vos transformations.

Types de transformations de base

Vous utiliserez souvent les transformations de base directement dans votre pipeline. Par ailleurs, de nombreuses autres transformations fournies dans le SDK Dataflow sont mises en œuvre à partir de transformations de base.

Les SDK Dataflow définissent les transformations de base suivantes :

  • ParDo pour le traitement parallèle générique
  • GroupByKey pour réaliser des regroupements par clé sur des paires clé-valeur
  • Combine pour combiner des collections ou des valeurs groupées
  • Flatten pour fusionner des collections

Transformations composites

Les SDK Dataflow prennent en charge les transformations composites, qui sont des transformations créées à partir de plusieurs sous-transformations. Le modèle des transformations dans le SDK Dataflow est modulaire, en ce sens que vous pouvez créer une transformation mise en œuvre à partir d'autres transformations. Vous pouvez considérer une transformation composite comme une étape complexe de votre pipeline contenant plusieurs étapes imbriquées.

Les transformations composites sont utiles lorsque vous souhaitez créer une opération pouvant être répétée et comportant plusieurs étapes. De nombreuses transformations intégrées incluses dans les SDK Dataflow, telles que Count et Top, constituent des exemples de transformations composites. Vous les utilisez exactement comme toute autre transformation.

Pour plus d'informations, consultez la page Créer des transformations composites.

Transformations prédéfinies dans les SDK Dataflow

Les SDK Dataflow fournissent un certain nombre de transformations pré-définies, qui sont à la fois des transformations de base et des transformations composites, dont la logique de traitement est écrite pour vous. Ce sont des transformations plus complexes pour combiner des données, les segmenter, les manipuler ou effectuer des analyses statistiques sur ces données.

Java

Vous pouvez trouver ces transformations dans le package com.google.cloud.dataflow.sdk.transforms et ses sous-packages.

Pour plus d'informations sur l'utilisation des transformations fournies dans les SDK Dataflow, consultez la page Transformations incluses dans les SDK.

Transformations racines pour la lecture et l'écriture de données

Les SDK Dataflow fournissent des transformations spécialisées, appelées transformations racines, pour faire entrer et sortir les données de votre pipeline. Ces transformations peuvent être utilisées à tout moment dans votre pipeline mais elles servent le plus souvent de racine et de point de terminaison pour votre pipeline. Elles incluent les transformations read (lecture), write (écriture) et create (création).

Les transformations de lecture, qui peuvent servir de racine à votre pipeline pour créer une PCollection initiale, sont utilisées pour créer des données de pipeline à partir de différentes sources. Ces sources peuvent inclure des fichiers texte stockés dans Google Cloud Storage, des données stockées dans BigQuery ou Pub/Sub et d’autres sources de stockage dans le cloud. Les SDK Dataflow fournissent également une API extensible pour utiliser vos propres sources de données personnalisées.

Les transformations d’écriture peuvent servir de points de terminaison de pipeline pour écrire dans une mémoire externe des PCollections contenant les données de sortie traitées. Les récepteurs de stockage de données externes peuvent inclure des fichiers textes stockés dans Google Cloud Storage, des tables BigQuery, Pub/Sub ou d'autres mécanismes de stockage dans le cloud.

Les transformations de création sont utiles pour créer une PCollection à partir de données en mémoire. Pour plus d'informations, consultez la page Créer une PCollection.

Pour plus d'informations sur les transformations de lecture et d'écriture, consultez la page E/S de pipeline.

Transformations avec plusieurs entrées et sorties

Certaines transformations acceptent plusieurs PCollections d'entrée ou des entrées secondaires spécialisées. Une transformation peut également produire plusieurs PCollections de sortie, ainsi que des sorties secondaires. Les SDK Dataflow fournissent une API de marquage pour vous aider à suivre et à transmettre plusieurs entrées et sorties de types différents.

Pour en savoir plus sur les transformations avec plusieurs entrées et sorties ainsi que sur le système d'ajout de tags, consultez la page Gérer plusieurs PCollections.

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.