Présentation
MiniLake est un émulateur local de l’API Databricks qui propose un environnement complet : exécution SQL native, prise en charge de Delta Lake et lancement de jobs Spark. L’application s’installe via pip install minilake ou sous forme d’image Docker (ghcr.io/dmux/minilake:latest) et écoute par défaut sur le port 8000. Aucun compte, aucune clé d’API et aucune facturation cloud ne sont requis ; l’image ne télécharge aucun fichier au démarrage, ce qui permet une utilisation air‑gapped.
Architecture et composants
Chaque catalogue créé dans MiniLake correspond à un fichier de base de données DuckDB distinct, ce qui rend l’adressage catalogue.schéma.table natif et évite les réécritures regex. Le moteur DuckDB intègre l’extension Delta, de sorte que les tables externes sont de véritables fichiers Parquet accompagnés d’un répertoire _delta_log/. Les tâches Spark sont exécutées dans un conteneur frère via spark-submit, garantissant que les INSERT, UPDATE et DELETE passent réellement par le moteur Spark. Le plan de contrôle expose des points d’accès tels que /_minilake/reset (réinitialisation du workspace), /health et /ready, ainsi que les API standards de Unity Catalog.
Fonctionnement des opérations SQL et Delta
L’exécution de requêtes s’appuie sur DuckDB : les formats de sortie incluent JSON_ARRAY, ARROW_STREAM et CSV, et le manifeste de résultat transmet les types de colonnes exacts. Les lectures utilisent duckdb_delta_scan(), tandis que les modifications de données sont déléguées à un job Spark réel. Exemple d’utilisation Python :
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.catalog import ColumnInfo, TableType
w = WorkspaceClient(host="http://localhost:8000", token="dev")
w.catalogs.create(name="sales")
w.schemas.create(name="store", catalog_name="sales")
w.tables.create(
name="orders", catalog_name="sales", schema_name="store",
table_type=TableType.MANAGED, data_source_format="DELTA",
storage_location="/data/sales/store/orders",
columns=[ColumnInfo(name="id", type_text="BIGINT"),
ColumnInfo(name="customer", type_text="STRING"),
ColumnInfo(name="amount", type_text="DECIMAL(10,2)")],
)
wh = w.warehouses.create(name="dev", cluster_size="Small")
w.statement_execution.execute_statement(
warehouse_id=wh.id,
statement="INSERT INTO sales.store.orders VALUES (1, 'Ana', 459.90)"
)
result = w.statement_execution.execute_statement(
warehouse_id=wh.id,
statement="SELECT customer, amount FROM sales.store.orders"
)
print(result.result.data_array) # [['Ana', '459.90']]
Le même jeu de données est lisible via l’API SQL de MiniLake, confirmant la cohérence entre le moteur DuckDB et le job Spark.
Intégration avec les outils Databricks
Le point d’accès http://localhost:8000 accepte les clients officiels : le SDK Databricks, la CLI, le provider Terraform et le framework databricks bundle. Un terraform apply crée des catalogues réels sous forme de bases DuckDB, et un second plan renvoie un état vide, preuve que le provider fonctionne comme en production. Les erreurs sont renvoyées sous forme {"error_code":..., "message":...}, tandis que les appels non implémentés retournent un statut HTTP 501, évitant les faux positifs. Exemple de requête curl :
curl http://localhost:8000/_minilake/health
curl -X POST http://localhost:8000/api/2.1/unity-catalog/catalogs \
-H 'Content-Type: application/json' \
-d '{"name": "sales"}'
Ces intégrations permettent aux pipelines CI/CD, aux agents LLM et aux développeurs de valider localement des workflows Databricks complets avant tout déploiement cloud.