Architecture · Batch Data Pipeline
Tägliche Batch-ETL: Rohdaten-Snapshots von Inside Airbnb werden von Airflow eingesammelt, unverändert in MinIO abgelegt und per Astro SDK nach PostgreSQL geladen. Ein separater Spark-Cluster übernimmt sekundäre Transformationen direkt auf den MinIO-Objekten; Metabase dient als BI-Schicht auf dem Data Warehouse.
External · HTTP
Inside Airbnb
Öffentlicher Datensatz, London-Snapshot als gzip-komprimierte CSV. Zugriff erfordert einen Browser-artigen User-Agent-Header (sonst HTTP 403).
GET http://data.insideairbnb.com/…/listings.csv.gz
Orchestration · Airflow DAG
listings @daily · catchup=False
Vier sequentielle Tasks in dags/listings.py, ausgeführt in Docker-Containern auf dem ndsnet-Bridge-Netz.
Object Storage · S3-kompatibel
MinIO
Persistenter Objektspeicher, Volume-Mount unter include/data/minio. Hostname bewusst minio (nicht der Containername) — Unterstriche brechen DNS-Auflösung für manche Clients.
s3://airbnb-raw/listings/<YYYY-MM-DD>/raw_listings.csv
Processing
Spark Standalone
Liest/schreibt direkt auf MinIO-Objekten via S3A (path.style.access=true). Beispiel-Job: stock_transform (JSON → CSV).
Data Warehouse
PostgreSQL
Ziel-Tabelle der täglichen Loads. if_exists="replace" — jeder Lauf ersetzt den Tabelleninhalt vollständig.
public.listings
Definiert in docker-compose.override.yml, alle Services im Netz ndsnet
| Service | Image | Ports |
|---|---|---|
| webserver / scheduler / triggerer | astro-runtime:12.9.0 | 8080 |
| minio | minio:RELEASE.2024-06-13 | 9000, 9001 |
| spark-master | ./spark/master | 7077, 8082 |
| spark-worker | ./spark/worker | 8081 |
| metabase | metabase:v0.52.8.4 | 3000 |
| docker-proxy | alpine/socat | 2376 |
Aus airflow_settings.yaml oder manuell in Admin → Connections
| Conn ID | Typ | Ziel |
|---|---|---|
| minio_s3 | AWS | http://minio:9000 |
| postgres | Postgres | postgres:5432 |
| listings_api | HTTP | data.insideairbnb.com |