Aller au contenu

Flux de données

Cette page suit une donnée depuis un système OLTP amont jusqu'à un dashboard exécutif et un agent IA répondant à une question en langage naturel.

Pipeline de bout en bout

flowchart LR
    subgraph Sources
        OLTP[(OLTP / SaaS<br/>PostgreSQL, API, fichiers)]
    end
    subgraph Ingestion[Couche 1 — Ingestion]
        DAG[DAG Airflow<br/>akko_banking_fraud_demo]
        SPARKI[Spark Connect<br/>réplicateur JDBC]
    end
    subgraph Storage[Couche 2 — Stockage]
        PG[(PostgreSQL<br/>akko-postgresql-data)]
        MINIO[(SeaweedFS<br/>bucket akko-warehouse)]
        POL[Apache Polaris<br/>catalogue REST Iceberg]
    end
    subgraph Compute[Couche 3 — Calcul]
        TRINO[Trino 480<br/>SQL fédéré]
        DBT[dbt Core<br/>couche sémantique]
        SPARK[Spark Connect<br/>ETL et features ML]
    end
    subgraph Consume[Couche 5 — Consommation]
        SUP[Superset<br/>tableaux de bord]
        JH[JupyterHub<br/>notebooks]
        ADEN[ADEN<br/>NL -> SQL -> Streamlit]
    end
    subgraph Govern[Couche 6 — Gouvernance]
        OM[OpenMetadata<br/>lignage et tags]
        KC[Keycloak<br/>jetons OIDC]
    end

    OLTP -->|CDC / batch| DAG
    DAG --> PG
    DAG --> SPARKI
    SPARKI -->|MERGE INTO iceberg.banking.transactions| POL
    POL -.métadonnées.-> MINIO
    POL --> TRINO
    PG --> TRINO
    TRINO --> DBT
    DBT --> POL
    TRINO --> SUP
    TRINO --> JH
    TRINO --> ADEN
    SPARK --> JH
    OM -.lignage colonne.-> TRINO
    OM -.ingestion.-> POL
    KC -.jeton utilisateur.-> TRINO
    KC -.jeton utilisateur.-> SUP
    KC -.jeton utilisateur.-> ADEN

Étape par étape

1. Ingestion brute — Postgres / fichiers / API

Les DAGs Airflow déposent les lignes brutes dans akko-postgresql-data ou directement dans SeaweedFS (S3). Le DAG akko_banking_fraud_demo appelle generate_transactions.py, puis délègue à Spark Connect pour la réplication JDBC.

2. Écriture lakehouse — Iceberg sur MinIO

Spark écrit des tables Iceberg partitionnées (iceberg.banking.transactions, partitionnées par region). Polaris stocke le schéma, l'historique de snapshots et la spec de partition dans son propre backend PostgreSQL.

3. Requêtage — Trino + dbt

Trino fédère la lecture entre les catalogues iceberg et postgresql. Les modèles dbt (adaptateur dbt-trino) construisent les couches organisées (raw, staging, analytics). Chaque exécution dbt émet des événements OpenLineage consommés par OpenMetadata pour le lignage colonne.

4. Consommation — Superset, JupyterHub, ADEN

  • Superset exécute le SQL vers Trino via le JWT Keycloak de l'utilisateur — RBAC et masques appliqués à chaque requête.
  • JupyterHub spawn des pods akko-notebook avec jupyter-ai, dbt-trino, pyspark et duckdb.
  • ADEN (couche 4) prend une question en langage naturel, appelle OpenMetadata + OPA + LiteLLM, puis exécute le SQL via Trino avec l'identité de l'appelant.

5. Gouvernance — OpenMetadata + OPA + Keycloak

Chaque table atterrit dans OpenMetadata avec tags (PII, GDPR.Personal), termes du glossaire métier et lignage. Les politiques OPA filtrent chaque requête Trino en s'appuyant sur les claims de rôle Keycloak.

Démo de référence

La démo banking-fraud (/demos/banking-fraud/) exécute ce flux de bout en bout en moins de 10 minutes sur k3d :

  1. Semer des transactions synthétiques dans Postgres.
  2. Répliquer vers Iceberg via Spark Connect.
  3. Entraîner un Isolation Forest dans MLflow.
  4. Scorer les transactions avec akko_ai_anomaly() + akko_ai_sentiment() dans un MERGE unique.
  5. Rafraîchir le tableau de bord Superset.
  6. Demander à ADEN : « Quelles régions ont dépassé 5 % de fraude la semaine dernière ? »

Liens