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-notebookavecjupyter-ai,dbt-trino,pysparketduckdb. - 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 :
- Semer des transactions synthétiques dans Postgres.
- Répliquer vers Iceberg via Spark Connect.
- Entraîner un Isolation Forest dans MLflow.
- Scorer les transactions avec
akko_ai_anomaly()+akko_ai_sentiment()dans un MERGE unique. - Rafraîchir le tableau de bord Superset.
- Demander à ADEN : « Quelles régions ont dépassé 5 % de fraude la semaine dernière ? »