Data Lake Architecture
Data lake adalah sistem penyimpanan yang menyimpan data dalam format mentah (raw) dalam skala besar. Berbeda dengan data warehouse yang menyimpan data terstruktur, data lake menerima semua jenis data.
Data Lake vs Data Warehouse
| Aspek | Data Lake | Data Warehouse |
|---|---|---|
| Data format | Raw (apapun: JSON, CSV, Parquet, gambar) | Structured (tabel, schema) |
| Schema | Schema-on-read (definisi saat query) | Schema-on-write (definisi saat load) |
| Storage | Object storage (S3, GCS) — sangat murah | Managed service — lebih mahal |
| Users | Data engineer, data scientist | Analyst, business users |
| Query speed | Bervariasi | Dioptimalkan untuk analitik |
Object Storage sebagai Data Lake
# Struktur folder di S3/GCS
s3://company-data-lake/
├── raw/ # Bronze: data mentah
│ ├── orders/
│ │ ├── year=2024/month=01/
│ │ │ ├── orders_20240101.parquet
│ │ │ └── orders_20240102.parquet
│ │ └── year=2024/month=02/
│ ├── user_events/
│ │ └── dt=2024-01-15/
│ │ ├── part-00000.jsonl
│ │ └── part-00001.jsonl
│ └── third_party/
│ └── google_analytics/
├── staging/ # Silver: cleaned
│ ├── orders/
│ └── users/
└── mart/ # Gold: aggregated
├── revenue_daily/
└── user_segments/
Partitioning
Membagi data ke dalam folder berdasarkan kolom tertentu. Sangat penting untuk performa query dan biaya.
# Tanpa partitioning:
# Query "orders bulan Januari" → scan SEMUA file (mahal!)
# Dengan partitioning by date:
# Query "orders bulan Januari" → scan hanya folder year=2024/month=01/ (murah!)
import pyarrow as pa
import pyarrow.parquet as pq
# Menulis data dengan partitioning
table = pa.Table.from_pandas(df)
pq.write_to_dataset(
table,
root_path="s3://data-lake/raw/orders/",
partition_cols=["year", "month"] # Otomatis buat folder structure
)
# Query dengan partition filter (hanya baca partisi relevan)
import duckdb
duckdb.sql("""
SELECT * FROM parquet_scan('s3://data-lake/raw/orders/**/*.parquet',
hive_partitioning=true)
WHERE year = 2024 AND month = 1
""")
Lakehouse
Evolusi terbaru: gabungan data lake + data warehouse. Teknologi seperti Delta Lake, Apache Iceberg, dan Apache Hudi menambahkan fitur warehouse (ACID transactions, schema evolution, time travel) di atas object storage.
# Delta Lake: ACID transactions di data lake
from delta.tables import DeltaTable
# UPSERT (merge) — tidak bisa di plain Parquet!
delta_table = DeltaTable.forPath(spark, "s3://lake/orders")
delta_table.alias("target").merge(
new_data.alias("source"),
"target.order_id = source.order_id"
).whenMatchedUpdateAll().whenNotMatchedInsertAll().execute()
# Time travel — query data versi lama
spark.read.format("delta").option("versionAsOf", 5).load("s3://lake/orders")