Trino + Delta Lake + MinIO + Hive Metastore
- Python 87.3%
- Dockerfile 12.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Vollständiger Data Lake Stack: - MinIO (S3 Object Storage) - PostgreSQL (Hive Metastore Backend) - Hive Metastore 4.0.1 (mit PostgreSQL + S3A Support) - Trino (SQL Query Engine) Funktioniert: - Sample Daten als Delta Lake (partitioniert) in MinIO - Trino SQL Queries auf Delta Lake Tabellen - Aggregationen (GROUP BY, COUNT, SUM, AVG) Siehe README.md für Setup-Anleitung. |
||
| hive-metastore | ||
| scripts | ||
| trino | ||
| docker-compose.yml | ||
| README.md | ||
Trino + Delta Lake + MinIO + Hive Metastore
Vollständiger Data Lake Stack mit Trino (SQL Engine), Delta Lake (Table Format), MinIO (S3 Storage) und Hive Metastore (Metadata).
Architektur
┌─────────────────────────────────────────────┐
│ Trino (8080) │
│ SQL Query Engine │
└──────────┬──────────────────┬───────────────┘
│ │
┌──────▼──────┐ ┌──────▼──────┐
│ Hive Meta │ │ MinIO │
│ Store │ │ (9000) │
│ (9083) │ │ S3 Storage│
└──────┬──────┘ └─────────────┘
│
┌──────▼──────┐
│ PostgreSQL │
│ (Metastore │
│ Backend) │
└─────────────┘
Komponenten
| Service | Port | Beschreibung |
|---|---|---|
| MinIO | 9000, 9001 | S3-kompatibler Object Storage |
| MinIO Console | 9001 | Web UI für MinIO |
| PostgreSQL | 5432 | Backend für Hive Metastore |
| Hive Metastore | 9083 | Metadata Service (Thrift) |
| Trino | 8080 | Distributed SQL Query Engine |
Setup
1. Stack starten
cd /home/docker/trino-delta-lake
docker compose up -d --build
2. Warten bis alles bereit ist
# Hive Metastore sollte "Initialized schema successfully" anzeigen
docker logs trino-hive-metastore 2>&1 | grep "Initialized"
# Trino sollte "SERVER STARTED" anzeigen
docker logs trino 2>&1 | grep "SERVER STARTED"
3. Sample Daten generieren
pip install polars deltalake boto3 s3fs pyarrow
python3 scripts/generate_sample_data.py
4. In Trino einloggen
docker exec -it trino trino
5. Schema und Tabelle erstellen
-- Schema erstellen
CREATE SCHEMA IF NOT EXISTS hive.player_stats
WITH (location = 's3a://delta-lake/warehouse/tables');
-- Tabelle registrieren (extern, zeigt auf Delta Lake Dateien)
CREATE TABLE hive.player_stats.player_stats (
player_id varchar,
username varchar,
game_mode varchar,
wins integer,
games integer,
playtime_seconds bigint,
p_delivery_date varchar
) WITH (
format = 'PARQUET',
external_location = 's3a://delta-lake/warehouse/tables/player_stats',
partitioned_by = ARRAY['p_delivery_date']
);
-- Partitionen synchronisieren
CALL hive.system.sync_partition_metadata('player_stats', 'player_stats', 'FULL');
6. Daten abfragen
-- Alle Daten
SELECT * FROM hive.player_stats.player_stats;
-- Aggregation
SELECT game_mode, COUNT(*) as players, SUM(wins) as total_wins
FROM hive.player_stats.player_stats
GROUP BY game_mode
ORDER BY total_wins DESC;
-- Nach Datum filtern
SELECT * FROM hive.player_stats.player_stats
WHERE p_delivery_date = '2026-09-01';
Dateien
├── docker-compose.yml # Alle Services
├── hive-metastore/
│ ├── Dockerfile # Hive Metastore mit PostgreSQL + S3 Support
│ └── core-site.xml # S3A Konfiguration für Hive
├── trino/
│ ├── etc/
│ │ ├── config.properties # Trino Server Config
│ │ ├── node.properties # Trino Node Config
│ │ └── log.properties # Logging Config
│ └── catalog/
│ ├── delta.properties # Delta Lake Catalog
│ └── hive.properties # Hive Catalog
└── scripts/
├── generate_sample_data.py # Sample Daten als Delta Lake
└── requirements.txt # Python Dependencies
Credentials (Demo)
| Service | User | Password |
|---|---|---|
| MinIO | minioadmin | minioadmin123 |
| PostgreSQL | hive | password |
| Trino | (keine Auth) | - |
⚠️ Für Production: Credentials über Vaultwarden oder Docker Secrets setzen!
Hive Metastore — Warum braucht man ihn?
Der Hive Metastore (HMS) speichert Tabellen-Metadata:
- Tabellen-Name, Schema (Spalten), Speicherort
- Partitionierung (welche Partitionen existieren, wo liegen sie)
- Tabellen-Format (PARQUET, DELTA, etc.)
Ohne HMS wüsste Trino nicht, dass eine Tabelle existiert. Der HMS macht aus "Dateien in S3" benannte Tabellen die man mit SQL abfragen kann.
Delta Lake — Warum als Table Format?
- ACID Transactions: Sichere Schreiboperationen
- Schema Evolution: Spalten hinzufügen ohne Tabelle neu zu erstellen
- Time Travel: Alte Versionen abfragen (
SELECT * FROM table VERSION AS OF 0) - Partition Pruning: Nur relevante Partitionen lesen
- Upsert/Delete: Datensätze aktualisieren und löschen