What "scalable" actually means for a data architecture

"Scalable" gets used as a marketing word more often than an engineering one. For a data architecture, it has a precise meaning: the cost and latency of your pipelines should grow roughly in line with data volume, not faster. A warehouse that takes 40 minutes to process 10GB and 14 hours to process 100GB isn't scalable, even if it technically "works" today.

The pattern that scales: raw, curated, consumption

Most scalable cloud architectures converge on the same three-layer separation, regardless of vendor:
Raw as-is, immutable Curated clean, deduped, typed Consumption disposable, per use case

Raw layer: an immutable copy of source data, as it arrived, partitioned by ingestion date. Nothing is cleaned or reshaped here — its only job is to make replay possible if something downstream breaks.

Curated layer: deduplicated, typed, and conformed to a stable schema. This is where business logic starts to appear, but it's still close to the source grain (one row per order line, one row per event).

Consumption layer: aggregated tables built for a specific dashboard or model, denormalized on purpose, and disposable — they can be dropped and rebuilt from the curated layer at any time.

A concrete example: partitioning strategy

The single most common scalability mistake is partitioning cloud storage the wrong way — or not at all. A table partitioned by ingestion date lets every downstream job skip the data it doesn't need instead of scanning everything:

(
    df.write
      .format("parquet")
      .partitionBy("ingestion_date")
      .mode("append")
      .save("s3://raw-zone/orders/")
)
This one line is the difference between a job that scans 2TB every run and one that scans the 40GB that actually changed since yesterday.

Three mistakes that quietly kill scalability

Over-provisioned compute No partition strategy Duplicated business logic
Over-provisioning compute "just in case": a cluster sized for peak load that runs 24/7 costs the same whether it's busy or idle. Autoscaling — or turning the cluster off between jobs — usually cuts cost by more than half without touching a line of pipeline code.
No partition strategy: a table with millions of tiny files (one per micro-batch, never compacted) is slower to query than a smaller number of well-sized files, because listing and opening files has its own fixed cost per file.
Business logic duplicated across the consumption layer: when five dashboards each recompute "active customer" slightly differently, that's not a scalability problem yet — it's the crack that becomes one. Centralize shared logic in the curated layer before it multiplies.

Subscribe to our Newsletter

Subscribe to our newsletter to get notifications about new updates, etc...