Bienvenue dans ce module oรน tu vas dรฉcouvrir les architectures Data Mesh et les Data Contracts โ deux concepts essentiels pour scaler les organisations data. Tu apprendras ร passer dโune architecture centralisรฉe ร une approche dรฉcentralisรฉe oรน chaque domaine est responsable de ses donnรฉes.
Prรฉrequis
Niveau
Compรฉtence
โ Requis
Data Lakehouse (M20)
โ Requis
Data Quality (M23)
โ Requis
Orchestration (M22, M28)
๐ก Recommandรฉ
Expรฉrience en organisation data
๐ฏ Objectifs du module
ร la fin de ce module, tu seras capable de :
Comprendre les 4 principes du Data Mesh
Concevoir des Data Products avec ownership clair
รcrire des Data Contracts complets
Implรฉmenter la validation de contracts avec Soda
Configurer DataHub comme Data Catalog
Gรฉrer la Schema Evolution sans casser les consommateurs
Mettre en place une gouvernance fรฉdรฉrรฉe
1. Introduction au Data Mesh
1.1 Problรจmes de lโArchitecture Centralisรฉe
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ARCHITECTURE CENTRALISรE (MONOLITHE) โ
โ โ
โ โโโโโโโโโโโ โ
โ โ Sales โโโโ โ
โ โ Domain โ โ โ
โ โโโโโโโโโโโ โ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโ โ โ โ โ โ โ
โ โMarketingโโโโผโโโโโโถโ Central Data โโโโโโโถโ Data Lake/ โ โ
โ โ Domain โ โ โ Team โ โ Warehouse โ โ
โ โโโโโโโโโโโ โ โ โ โ โ โ
โ โโโโโโโโโโโ โ โ (bottleneck!) โ โโโโโโโโโโโโโโโโโโโ โ
โ โ Finance โโโโ โโโโโโโโโโโโโโโโโโโโ โ
โ โ Domain โ โ
โ โโโโโโโโโโโ โ
โ โ
โ PROBLรMES : โ
โ โ รquipe data = bottleneck (tout passe par eux) โ
โ โ Pas de ownership clair ("c'est pas mes donnรฉes") โ
โ โ Time-to-market lent (file d'attente de demandes) โ
โ โ รquipe data ne connaรฎt pas le contexte mรฉtier โ
โ โ Scalabilitรฉ organisationnelle limitรฉe โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1.2 Les 4 Principes du Data Mesh
Le Data Mesh est une approche architecturale proposรฉe par Zhamak Dehghani (Thoughtworks) en 2019.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ LES 4 PRINCIPES DU DATA MESH โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 1๏ธโฃ DOMAIN OWNERSHIP โ โ
โ โ Chaque domaine mรฉtier est responsable de ses donnรฉes โ โ
โ โ โ Sales gรจre les donnรฉes sales, Marketing gรจre les donnรฉes mktg โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 2๏ธโฃ DATA AS A PRODUCT โ โ
โ โ Les donnรฉes sont traitรฉes comme un produit avec des clients โ โ
โ โ โ SLOs, documentation, support, qualitรฉ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 3๏ธโฃ SELF-SERVE DATA PLATFORM โ โ
โ โ Une plateforme qui permet aux domaines d'รชtre autonomes โ โ
โ โ โ Infra, outils, templates, pas besoin de l'รฉquipe centrale โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ 4๏ธโฃ FEDERATED COMPUTATIONAL GOVERNANCE โ โ
โ โ Gouvernance dรฉcentralisรฉe avec standards globaux โ โ
โ โ โ Policies automatisรฉes, interopรฉrabilitรฉ, compliance โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
1.3 Data Mesh vs Data Lake vs Data Lakehouse
Aspect
Data Lake
Data Lakehouse
Data Mesh
Type
Architecture technique
Architecture technique
Architecture organisationnelle
Focus
Stockage
Stockage + Analytics
Organisation + Ownership
Centralisation
Centralisรฉ
Centralisรฉ
Dรฉcentralisรฉ
Ownership
รquipe data
รquipe data
Domaines mรฉtier
Compatibilitรฉ
โ
โ
Peut utiliser Lakehouse underneath
โ ๏ธ Important : Data Mesh nโest PAS une technologie, cโest une approche organisationnelle. Tu peux implรฉmenter un Data Mesh avec un Data Lakehouse comme infrastructure.
1.4 Quand Adopter le Data Mesh ?
โ Data Mesh est adaptรฉ si : - Organisation large (>100 personnes dans la data) - Plusieurs domaines mรฉtier distincts - รquipe data centrale = bottleneck avรฉrรฉ - Domaines ont des รฉquipes techniques capables - Culture dโownership et dโautonomie
โ Data Mesh nโest PAS adaptรฉ si : - Petite organisation (<20 personnes data) - Un seul domaine mรฉtier - Pas assez de maturitรฉ technique dans les domaines - Besoin de contrรดle centralisรฉ fort - Ressources limitรฉes pour la plateforme
2. Domain Ownership & Data Products
2.1 Identifier les Domaines
Un domaine correspond gรฉnรฉralement ร un bounded context (DDD - Domain-Driven Design).
โ SANS DATA CONTRACT :
Producer: "J'ai renommรฉ la colonne 'user_id' en 'customer_id', c'รฉtait plus clair."
Consumer: "Tu as cassรฉ tous nos dashboards !" ๐ก
Producer: "C'est pas ma faute si vous dรฉpendez de mes donnรฉes sans me prรฉvenir."
โ AVEC DATA CONTRACT :
Producer: "Je veux renommer 'user_id' en 'customer_id'."
Contract: "Breaking change dรฉtectรฉ. 3 consommateurs impactรฉs."
Producer: "OK, je crรฉe une nouvelle version avec pรฉriode de deprecation."
4.2 Anatomie dโun Data Contract
Un Data Contract dรฉfinit lโinterface entre un producteur et ses consommateurs.
Voir le code
# Exemple de Data Contract complet (YAML)data_contract_yaml ="""# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# DATA CONTRACT : orders_fact# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโdataContractSpecification: 0.9.3id: orders-domain.orders-fact# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# INFO : Mรฉtadonnรฉes gรฉnรฉrales# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโinfo: title: Orders Fact Table version: 1.0.0 status: active # draft | active | deprecated | retired description: | Table de faits contenant toutes les commandes. Une ligne par commande. Mise ร jour en near real-time. owner: orders-team@company.com contact: slack: "#orders-data" oncall: "https://pagerduty.com/orders-data"# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# SCHEMA : Structure des donnรฉes# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโschema: type: table fields: - name: order_id type: string required: true unique: true description: Identifiant unique de la commande (UUID v4) example: "550e8400-e29b-41d4-a716-446655440000" pii: false - name: customer_id type: string required: true description: Rรฉfรฉrence au domaine customers pii: true - name: order_date type: timestamp required: true description: Date et heure de la commande (UTC) - name: amount type: decimal(10,2) required: true description: Montant total en EUR constraints: minimum: 0 maximum: 1000000 - name: status type: string required: true description: Statut actuel de la commande enum: - pending - confirmed - shipped - delivered - cancelled - name: shipping_country type: string required: false description: Code pays ISO 3166-1 alpha-2 pattern: "^[A-Z]{2}$"# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# SEMANTICS : Signification mรฉtier# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโsemantics: granularity: one row per order temporality: event time (order_date) updateFrequency: near real-time (< 15 min) businessRules: - "amount = somme des lignes + taxes - remises" - "Les commandes annulรฉes restent dans la table (status=cancelled)" - "order_date est en UTC, pas en heure locale"# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# QUALITY : SLOs de qualitรฉ# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโquality: freshness: threshold: 1 hour column: order_date completeness: - column: order_id threshold: 100% - column: customer_id threshold: 100% - column: amount threshold: 99.9% validity: - column: amount rule: ">= 0" threshold: 100% - column: status rule: "in enum values" threshold: 100% uniqueness: - column: order_id threshold: 100%# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# SLA : Service Level Agreements# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโsla: availability: 99.9% latency: "< 5 minutes from source" retention: 7 years supportHours: "24/7" incidentResponse: "< 1 hour"# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ# ACCESS : Qui peut accรฉder# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโaccess: classification: internal location: "snowflake://prod.orders.orders_fact" consumers: - team: analytics purpose: dashboards - team: marketing purpose: segmentation - team: finance purpose: revenue reporting"""print("๐ Data Contract Example:")print(data_contract_yaml)
4.3 DataContract CLI (Open Source)
# Installationpip install datacontract-cli# Initialiser un nouveau contractdatacontract init orders-fact# Valider la syntaxedatacontract lint datacontract.yaml# Tester contre des donnรฉes rรฉellesdatacontract test datacontract.yaml \--source snowflake://prod.orders.orders_fact# Gรฉnรฉrer la documentation HTMLdatacontract export datacontract.yaml --format html > docs/orders.html# Dรฉtecter les breaking changesdatacontract diff v1/datacontract.yaml v2/datacontract.yaml
4.4 Validation avec Soda
Voir le code
# Soda checks gรฉnรฉrรฉs depuis le Data Contractsoda_checks_yaml ="""# soda_checks.yaml# Gรฉnรฉrรฉ depuis le Data Contract orders-domain.orders-factchecks for orders_fact: # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # Freshness : donnรฉes < 1 heure # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ - freshness(order_date) < 1h: name: "Data freshness SLO" fail: when > 1h warn: when > 30m # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # Completeness : pas de nulls sur colonnes required # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ - missing_count(order_id) = 0: name: "order_id completeness" - missing_count(customer_id) = 0: name: "customer_id completeness" - missing_percent(amount) < 0.1: name: "amount completeness (99.9%)" # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # Validity : valeurs dans les plages attendues # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ - invalid_count(amount) = 0: name: "amount must be >= 0" valid min: 0 - invalid_count(status) = 0: name: "status must be in enum" valid values: [pending, confirmed, shipped, delivered, cancelled] - invalid_count(shipping_country) = 0: name: "shipping_country format" valid regex: "^[A-Z]{2}$" # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # Uniqueness : pas de doublons # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ - duplicate_count(order_id) = 0: name: "order_id uniqueness" # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ # Volume : anomaly detection # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ - anomaly detection for row_count: name: "Volume anomaly detection" warn: when diff > 20% fail: when diff > 50%"""print("โ Soda Checks (from Data Contract):")print(soda_checks_yaml)
Naming conventions, formats de dates, compliance GDPR
Platform team
Local
Schema spรฉcifique, SLOs, refresh frequency
Domain team
7.3 Standards Communs (Interopรฉrabilitรฉ)
# global_standards.yaml# Standards que TOUS les domaines doivent respecternaming:tables:"{domain}_{entity}_{type}" # orders_customers_dimcolumns: snake_casetimestamps:"*_at"suffix # created_at, updated_atformats:dates: ISO 8601 (YYYY-MM-DD)timestamps: ISO 8601 with timezone (UTC)currency: ISO 4217 codes (EUR, USD)country: ISO 3166-1 alpha-2 (FR, US)quality:minimumFreshness: 24hminimumCompleteness: 95%requiredTests:- uniqueness on primary key- not null on required columnscompliance:piiColumns:mustBeTagged:truedefaultRetention: 3 yearsencryption: required
7.4 Data Quality as Code
# Policies automatisรฉes via CI/CDdef validate_global_standards(contract):"""Valider qu'un contract respecte les standards globaux.""" errors = []# 1. Naming conventionifnot re.match(r'^[a-z]+_[a-z]+_(fact|dim|event)$', contract['info']['title']): errors.append("Table name must follow {domain}_{entity}_{type} convention")# 2. Required metadataif'owner'notin contract['info']: errors.append("Owner is required")# 3. Quality SLOsif contract.get('quality', {}).get('freshness', {}).get('threshold', '999h') >'24h': errors.append("Freshness SLO must be <= 24h")# 4. PII taggingfor field in contract.get('schema', {}).get('fields', []):if'pii'notin field: errors.append(f"Field {field['name']} must have PII tag")return errors
7.5 Compliance (GDPR, PII)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ PII MANAGEMENT โ
โ โ
โ 1. IDENTIFICATION โ
โ Tag PII columns in contract: pii: true โ
โ โ
โ 2. CLASSIFICATION โ
โ โข Direct PII: email, phone, SSN โ
โ โข Indirect PII: customer_id, IP address โ
โ โข Sensitive: health, financial, political โ
โ โ
โ 3. PROTECTION โ
โ โข Encryption at rest โ
โ โข Access control (need-to-know) โ
โ โข Masking for non-prod environments โ
โ โ
โ 4. RETENTION โ
โ โข Define retention period per classification โ
โ โข Automated deletion โ
โ โข Right to be forgotten (GDPR) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
8. Implรฉmentation Pratique
8.1 Par Oรน Commencer ?
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ROADMAP D'ADOPTION DATA MESH โ
โ โ
โ PHASE 1: PILOT (3-6 mois) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โข Choisir 1-2 domaines pilotes โ
โ โข Dรฉfinir les premiers Data Products โ
โ โข รcrire les premiers Data Contracts โ
โ โข Setup basique du catalog (DataHub) โ
โ โ
โ PHASE 2: EXPAND (6-12 mois) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โข Ajouter 3-5 domaines โ
โ โข Dรฉvelopper la self-serve platform โ
โ โข Automatiser la validation des contracts โ
โ โข Dรฉfinir les standards globaux โ
โ โ
โ PHASE 3: SCALE (12+ mois) โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โข Tous les domaines on-boardรฉs โ
โ โข Plateforme mature et self-serve โ
โ โข Gouvernance fรฉdรฉrรฉe opรฉrationnelle โ
โ โข Mรฉtriques et amรฉlioration continue โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
8.2 Critรจres de Sรฉlection des Domaines Pilotes
Critรจre
Bon candidat
Mauvais candidat
Maturitรฉ รฉquipe
รquipe tech capable
Pas de compรฉtences data
Complexitรฉ
Modรฉrรฉe
Trop simple ou trop complexe
Visibilitรฉ
Impact business visible
Projet interne invisible
Dรฉpendances
Peu de dรฉpendances
Dรฉpend de tout le monde
Sponsor
Management engagรฉ
Pas de sponsor
8.3 Anti-Patterns ร รviter
Anti-Pattern
Problรจme
Solution
Big Bang
Tout migrer dโun coup
Approche incrรฉmentale
Platform-first
Construire la plateforme avant les besoins
Use-case driven
No Governance
Chaque domaine fait ce quโil veut
Standards globaux
Over-Governance
Trop de rรจgles, retour au bottleneck
Balance global/local
Copy-Paste
Copier les donnรฉes au lieu de les consommer
Data Products vrais
8.4 Mรฉtriques de Succรจs
Mรฉtrique
Description
Target
Time to Data
Temps pour accรฉder ร une nouvelle donnรฉe
< 1 jour
Data Product Count
Nombre de Data Products publiรฉs
Croissance
Contract Coverage
% de tables avec contract
> 80%
Quality Score
Score moyen de qualitรฉ
> 95%
Consumer Satisfaction
NPS des consommateurs
> 50
9. Exercices Pratiques
Exercice 1 : Identifier les Domaines
Pour une entreprise de e-commerce avec les รฉquipes suivantes : - รquipe Produit (catalogue, pricing) - รquipe Ventes (commandes, paiements) - รquipe Logistique (livraisons, stock) - รquipe Marketing (campagnes, analytics) - รquipe Support (tickets, satisfaction)
Questions : 1. Identifier les 5 domaines Data Mesh 2. Lister 2-3 Data Products par domaine 3. Identifier les dรฉpendances entre domaines
Exercice 2 : รcrire un Data Contract
รcrire un Data Contract complet pour la table customers_dim avec : - 6+ colonnes (id, name, email, country, created_at, segment) - PII identifiรฉ - SLOs de qualitรฉ - SLA de disponibilitรฉ
Exercice 3 : Setup DataHub Local
Installer DataHub avec Docker
Crรฉer une recette dโingestion pour un fichier Parquet local
Exรฉcuter lโingestion
Explorer le lineage dans lโUI
Exercice 4 : Validation de Contract avec Soda
Convertir le Data Contract de lโexercice 2 en checks Soda
Crรฉer des donnรฉes de test (certaines valides, certaines invalides)
Exรฉcuter Soda et interprรฉter les rรฉsultats
Exercice 5 : Schema Evolution
Simuler une schema evolution : 1. Version 1.0.0 du contract orders_fact 2. Ajouter une colonne nullable discount_code (non-breaking) 3. Renommer user_id en customer_id (breaking) 4. Documenter le processus de deprecation