Revenir au contenu principal
Ingénierie

Lisez, ne copiez pas : remplacer les flux de fichiers par OpenSharing - Partie 2 (Comment implémenter)

Ce que le destinataire fait concrètement avec une table partagée

par Jordan Soldo et Nikhil Tallam

  • OpenSharing expose une table Delta via un protocole ouvert, ce qui permet aux destinataires de la lire en temps réel au lieu de l'importer à partir de fichiers programmés ou d'exportations d'API.
  • Cela supprime les tâches d'exportation par destinataire, le suivi des fichiers et le rapprochement nécessaires avec les flux de fichiers et d'API.
  • Les destinataires lisent la table partagée sous forme de flux incrémentiel avec points de contrôle, incluant les ajouts, modifications et suppressions de lignes reçus via Change Data Feed.

De nombreuses architectures de partage de données commencent par un schéma familier :

  • Un fournisseur exporte un fichier selon un calendrier défini.
  • Le fichier arrive dans un bucket ou est transféré via un point de terminaison SFTP.
  • Le destinataire détecte le nouveau fichier, le charge, le déduplique et suit ce qui a déjà été traité.
  • Les mises à jour et les suppressions nécessitent des conventions supplémentaires ou des tâches de réconciliation.

La première partie de ce blog a décrit pourquoi une table partagée peut constituer une meilleure alternative à un fichier récurrent ou à un flux API. Examinons maintenant ce que le destinataire fait réellement de cette table.

Cette procédure se concentre sur le partage entre environnements Databricks (D2D). Le destinataire dispose d'un espace de travail Databricks compatible avec Unity Catalog et accède à la table partagée via un catalogue partagé. Le fournisseur partage la table avec son historique, ce qui permet au destinataire de l'utiliser comme source Structured Streaming. Nous reviendrons sur le partage vers des environnements ouverts (D2O) plus loin dans cet article.

Comment OpenSharing remplace le flux

Une table Delta conserve un historique ordonné de chaque modification qui lui est apportée. OpenSharing expose cette table via un protocole ouvert sans la copier. Les données restent dans le stockage du fournisseur et le destinataire les lit en temps réel.

Du côté du destinataire, vous pointez un lecteur Structured Streaming vers la table partagée. Spark enregistre sa progression dans un point de contrôle, de sorte que chaque exécution ne récupère que les modifications apportées depuis la dernière. Le suivi des « nouveautés depuis ma dernière consultation » devient la tâche du moteur, s'exécutant sur des données gouvernées dont le lignage et le contrôle d'accès sont préservés.

Configurer le partage (des deux côtés)

Prenons un exemple : un distributeur gère une table de commandes en direct et la partage avec un destinataire externe utilisant Databricks. Au lieu de recevoir un fichier CSV chaque nuit, le destinataire peut interroger directement la table de commandes partagée. Si le destinataire a besoin d'une copie locale pour l'analytique ou pour des charges de travail en aval, il peut matérialiser les données de manière incrémentielle dans une table Delta. La configuration s'effectue une seule fois et est répartie entre le fournisseur et le destinataire.

Fournisseur

Créez la table source en activant Change Data Feed, puis publiez-la dans un partage avec l'option WITH HISTORY. L'historique est ce qui fait de la table une source incrémentielle. Sans lui, le destinataire n'obtient qu'un instantané statique. L'activation de Change Data Feed (delta.enableChangeDataFeed) est facultative pour la lecture incrémentielle principale ci-dessous. Ne l'activez que si vous prévoyez d'utiliser ultérieurement le parcours des upserts et des suppressions. Si vous utilisez Databricks Runtime 19 ou une version ultérieure, vous pouvez ignorer cette propriété et vous appuyer sur la fonction automatic Change Data Feed, qui calcule les modifications au niveau des lignes au moment de l'interrogation pour les tables dont le suivi des lignes est activé, et qui fonctionne avec le partage OpenSharing de Databricks à Databricks.

Enregistrez le destinataire par son identifiant de partage, puis accordez les droits sur le partage :

Veuillez noter que les commandes CREATE SHARE et CREATE RECIPIENT nécessitent des privilèges au niveau du métastore et non pas seulement des droits d'administrateur d'espace de travail.

Destinataire

Le partage apparaît désormais comme un fournisseur dans votre métastore. Montez-le en tant que catalogue et vous pourrez le lire comme n'importe quelle autre table.

Lecture du flux

Une fois le partage monté sous le nom shared_in, la lecture est gérée par Structured Streaming.

Trigger.AvailableNow traite toutes les données actuellement disponibles et non traitées à l'aide d'un ou de plusieurs micro-lots, puis s'arrête. Cela en fait une solution idéale pour les tâches incrémentielles planifiées. Au lieu d'un calendrier fixe, vous pouvez également configurer la tâche avec un déclencheur de mise à jour de table sur la table partagée, de sorte que la tâche ne s'exécute que lorsque le fournisseur valide de nouvelles données. Il est recommandé de stocker le point de contrôle dans un stockage cloud durable tel que UC Volumes.

Remarque : Cet exemple lit une table partagée via Delta Sharing, il utilise donc ignoreChanges. Si vous diffusez des flux directement à partir d'une table Delta classique, les runtimes Databricks plus récents utilisent skipChangeCommits pour le traitement en mode ajout uniquement.

Pour prouver qu'il s'agit bien d'un traitement incrémentiel, exécutez le flux une première fois sur un ensemble initial de lignes. Réexécutez-le après avoir ajouté de nouvelles lignes chez le fournisseur. L'historique des validations de la table cible affichera deux écritures en streaming :

Version

Opération

Métriques de l'opération

2

STREAMING UPDATE

numRemovedFiles: 0, numOutputRows: 200, numOutputBytes: 2307, numAddedFiles: 1

1

STREAMING UPDATE

numRemovedFiles: 0, numOutputRows: 1000, numOutputBytes: 4958, numAddedFiles: 1

0

CREATE TABLE

{}

La deuxième exécution a écrit 200 lignes, et non 1200. Le point de contrôle a suivi la dernière version lue, de sorte que l'exécution n'a extrait que les nouvelles.

ignoreChanges convient à ce type de chargement incrémentiel, mais il peut réémettre des lignes et ne propage pas les suppressions. Si les consommateurs en aval ont besoin d'insertions, de mises à jour et de suppressions, lisez plutôt le flux de modifications (Change Data Feed) de la table partagée :

Ce qui change sur le plan opérationnel

Lorsqu'un nouveau client est ajouté, le fournisseur n'a pas besoin de créer un nouveau point de terminaison SFTP ni de mettre en œuvre une nouvelle tâche d'exportation. Le fournisseur accorde au destinataire l'accès au partage. Le destinataire utilise le même schéma général tout en maintenant distinctes ses propres tables cibles et sa logique métier en aval. La différence opérationnelle est significative :

  • Le fournisseur gère une seule table source gouvernée au lieu d'un export séparé.
  • L'accès est géré via le partage : les destinataires D2D utilisent les autorisations sur le Unity Catalog partagé, tandis que les destinataires D2O utilisent le flux d'authentification OpenSharing applicable.
  • Le destinataire récupère les données à partir de l'historique de la table plutôt que d'assurer un suivi via des fichiers personnalisés ou des horodatages.
  • Les remplissages (backfills) peuvent utiliser des versions historiques de la table sans obliger le fournisseur à recréer les anciens fichiers.
  • Change Data Feed fournit au destinataire des événements explicites d'insertion, de mise à jour et de suppression lorsque ce comportement est requis.
  • Les deux parties disposent d'une frontière plus claire : le fournisseur est propriétaire du produit de données partagé et le destinataire est propriétaire de son traitement en aval.

Destinataires n'utilisant pas Databricks (D2O)

Tout ce qui précède fonctionne parce que le destinataire exécute Spark sur Databricks, ce qui permet d'utiliser le streaming avec points de contrôle et le CDF. D'autres destinataires (pandas, outils décisionnels, Snowflake) se connectent via OpenSharing à l'aide d'un fichier d'informations d'identification plutôt que d'un identifiant de partage de métastore.

S'ils exécutent Spark Open Source, la lecture utilise le même code spark.readStream via le connecteur Delta Sharing. Sans Spark, il n'y a pas de flux continu, ils récupèrent donc les modifications par plage de versions :

Commencer à ingérer des données avec OpenSharing

Un premier projet utile n'a pas besoin de résoudre tous les scénarios de partage. Commencez par une seule table Delta classique et un seul destinataire.

Avant de mettre en œuvre le flux, répondez à ces questions :

  • Le destinataire utilise-t-il D2D ou D2O ?
  • Le destinataire a-t-il besoin d'un instantané, de lectures incrémentielles ou de CDC au niveau des lignes ?
  • Le partage inclut-il l'historique ?
  • Le CDF est-il activé si les mises à jour et les suppressions doivent être propagées ?
  • Quelle version de Databricks Runtime ou du connecteur OpenSharing le destinataire utilisera-t-il ?
  • Comment le destinataire gérera-t-il les nouvelles tentatives, les doublons, les suppressions et les modifications de schéma ?
  • Qui est responsable de la surveillance et du support une fois le partage en production ?

Une fois ces réponses claires, validez le flux de bout en bout le plus simple possible : créez le partage, lisez un instantané initial, écrivez une nouvelle ligne, mettez à jour une ligne, supprimez une ligne et confirmez que le destinataire obtient les résultats attendus.

C'est la transformation pratique qu'OpenSharing rend possible. Au lieu de créer un nouveau flux de transport et d'ingestion pour chaque client, vous pouvez établir un contrat de partage de données gouverné et permettre à chaque destinataire de consommer les données via le parcours qui convient à sa plateforme.

Références

Vous débutez avec OpenSharing ? Commencez par Qu'est-ce que OpenSharing ? et Créer des partages pour OpenSharing, puis configurez le flux de bout en bout minimal ci-dessus avec une table et un destinataire.

(Cet article de blog a été traduit à l'aide d'outils basés sur l'intelligence artificielle) Article original

Tags associés:

Tutoriels

Recevez les derniers articles dans votre boîte mail

Abonnez-vous à notre blog et recevez les derniers articles directement dans votre boîte mail.