Belakangan ini, konsep LTAP (Lakehouse-Tiered Analytical Pipeline) lagi banyak dibahas di komunitas data engineering. Ide utamanya: gabungkan performa transaksional dari Postgres dengan efisiensi storage Parquet di S3 untuk workload analytics.
Gw pertama kali implementasi arsitektur ini di project data pipeline yang handle 50 juta events per bulan. Sebelumnya, semua data cuma di Postgres — dan query analytics mulai bikin performa transaksi turun. Setelah migrate ke LTAP, performa transaksi naik 3x dan query analytics yang tadinya timeout sekarang selesai dalam hitungan detik.
Kenapa LTAP?
Sebelum LTAP, ada dua pilihan ekstrem:
| Approach | Pros | Cons |
|---|---|---|
| Semua di Postgres | Simple, ACID, JOIN mudah | Analytics lambat, storage mahal, scaling susah |
| Semua di Data Lake (S3+Parquet) | Cheap storage, columnar, scalable | Tidak ada transaksi, query latency tinggi, setup kompleks |
| LTAP (Hybrid) | Best of both worlds | Perlu ETL pipeline, konsistensi data |
Architecture Overview
APPLICATION LAYER
(Web App, API, Mobile App)
|
v
HOT TIER: PostgreSQL
- Last 90 days of data
- Full ACID transactions
- Real-time queries less than 100ms
|
| ETL (daily/hourly)
v
WARM TIER: Parquet on S3
- 90 days - 2 years of data
- Columnar format, compressed
- Analytics queries 10-50x faster
|
| Archive (yearly)
v
COLD TIER: Parquet on S3 Glacier
- more than 2 years of data
- Cheapest storage
- Batch analytics only
Implementasi: Step by Step
Step 1: Setup Postgres
-- Buat partitioned table untuk time-series data
CREATE TABLE events (
id BIGSERIAL,
event_type VARCHAR(50),
user_id INTEGER,
payload JSONB,
created_at TIMESTAMPTZ DEFAULT NOW()
) PARTITION BY RANGE (created_at);
-- Partisi per bulan
CREATE TABLE events_2026_07 PARTITION OF events
FOR VALUES FROM ('2026-07-01') TO ('2026-08-01');
CREATE INDEX idx_events_created ON events (created_at DESC);
CREATE INDEX idx_events_user ON events (user_id);
Step 2: Export ke Parquet
-- Export data yang lebih dari 90 hari
COPY (
SELECT * FROM events
WHERE created_at less than NOW() - INTERVAL '90 days'
AND created_at greater than or equal to NOW() - INTERVAL '91 days'
) TO '/tmp/export.parquet' WITH (FORMAT PARQUET);
-- Upload ke S3
aws s3 cp /tmp/export.parquet \
s3://data-lake/events/year=2026/month=06/events.parquet
Step 3: Query dengan DuckDB
-- DuckDB bisa query Parquet langsung dari S3
-- Tidak perlu download ke local
INSTALL httpfs;
LOAD httpfs;
-- Query data dari S3
SELECT event_type, COUNT(*) as cnt
FROM 's3://data-lake/events/**/*.parquet'
WHERE created_at greater than or equal to '2026-01-01'
GROUP BY event_type
ORDER BY cnt DESC;
Performance Benchmark
| Query | Postgres Only | LTAP (Parquet+S3) | Improvement |
|---|---|---|---|
| Daily active users (90d) | 45s | 1.2s | 37x faster |
| Monthly revenue report | 180s (timeout) | 3.8s | 47x faster |
| User cohort analysis | 320s (timeout) | 5.2s | 61x faster |
| Real-time transaksi | 12ms | 8ms | 1.5x faster |
Kenapa Parquet lebih cepat untuk analytics? Karena columnar storage. Kalau lo query SELECT user_id, amount FROM orders, Parquet cuma baca 2 kolom dari disk, bukan semua kolom. Dan dengan compression (Snappy/Zstd), data size bisa 5-10x lebih kecil dari Postgres raw rows.
ETL Pipeline
#!/usr/bin/env python3
"""Simple ETL: Postgres to Parquet to S3"""
import psycopg2
import pyarrow as pa
import pyarrow.parquet as pq
import pyarrow.fs as fs
# Connect to Postgres
conn = psycopg2.connect("dbname=analytics")
# Query data older than 90 days
query = """
SELECT * FROM events
WHERE created_at less than NOW() - INTERVAL '90 days'
AND exported = FALSE
"""
# Read to Arrow table
table = pq.read_table(conn, query)
# Write to Parquet (partitioned by year/month)
pq.write_to_dataset(
table,
root_path="s3://data-lake/events",
partition_cols=["year", "month"],
compression="zstd"
)
# Mark as exported
conn.execute("""
UPDATE events SET exported = TRUE
WHERE created_at less than NOW() - INTERVAL '90 days'
""")
conn.commit()
LTAP bukan cuma arsitektur — ini fundamental shift dalam approach data management. Untuk memahami bagaimana Parquet bekerja secara底层, cek juga perbandingan vector database yang menjelaskan format penyimpanan modern lainnya. Dan kalau lo perlu logging pipeline untuk ETL ini, baca perbandingan ELK vs Loki.
💬 Komentar (0)
Belum ada komentar. Jadilah yang pertama! 💬