Teknologi

Arsitektur LTAP: Postgres + Parquet + S3 untuk Data Analytics Skalabel

Arsitektur LTAP: Postgres + Parquet + S3 untuk Data Analytics Skalabel

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:

ApproachProsCons
Semua di PostgresSimple, ACID, JOIN mudahAnalytics lambat, storage mahal, scaling susah
Semua di Data Lake (S3+Parquet)Cheap storage, columnar, scalableTidak ada transaksi, query latency tinggi, setup kompleks
LTAP (Hybrid)Best of both worldsPerlu 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

QueryPostgres OnlyLTAP (Parquet+S3)Improvement
Daily active users (90d)45s1.2s37x faster
Monthly revenue report180s (timeout)3.8s47x faster
User cohort analysis320s (timeout)5.2s61x faster
Real-time transaksi12ms8ms1.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! 💬

Komentar akan muncul setelah moderasi.