Data Lake Architecture
Data Lake Architecture is a data-storage and processing architecture in which raw or lightly-processed data — structured tables, semi-structured JSON/Avro/Parquet, unstructured logs, images, video — is collected into a single large repository (historically the Hadoop Distributed File System; today almost universally cloud object storage like Amazon S3, Google Cloud Storage, or Azure Blob Storage) and made available for analytical processing without an upfront schema definition. The term was coined by James Dixon, then CTO of Pentaho, in his October 2010 blog post “Pentaho, Hadoop, and Data Lakes” (cited above), explicitly contrasting the lake with the structured data warehouse: where the warehouse imposes a strict schema at write time and transforms data via ETL pipelines before storage (“schema-on-write”), the lake stores raw data as-is and applies schema only when querying (“schema-on-read”). The architecture’s intellectual lineage runs through the Hadoop ecosystem (Apache Hadoop, Hive, Pig, Spark) which made petabyte-scale schema-on-read economically practical, the rise of cheap object storage (Amazon S3 launched 2006, with effectively unlimited capacity at ~$0.02/GB/month), and the parallel decline of structured ETL warehouses for everything except the most highly-curated business reporting. The architecture became dominant in the 2010s for analytics workloads — every Fortune 500 company runs a data lake of some form, often as the foundation under their Snowflake / Databricks / Redshift warehouses — but the schema-on-read promise turned out to have hidden costs (the “data swamp” anti-pattern, governance failures, performance penalties from re-deriving schema on every query) that motivated the Lakehouse evolution (Armbrust et al., CIDR 2021, cited above) where open table formats — Apache Iceberg, Delta Lake, Apache Hudi — add ACID transactions, schema evolution, and indexing on top of object-storage files. The interview-relevant point is that you must understand the lake not as “a place to dump data” but as a deliberate architectural tradeoff (cheap ingest + flexible compute vs governance debt + query overhead), and you must recognize when a lake is the right substrate (heterogeneous data, exploratory analytics, machine-learning training corpora) versus when a warehouse or lakehouse is the right substrate (structured BI reporting, billing-grade aggregations, transactional consistency).
0. Historical Context — James Dixon’s 2010 Coining and the Hadoop Era
The “data lake” metaphor was coined by James Dixon, then CTO of Pentaho, in his October 14, 2010 blog post “Pentaho, Hadoop, and Data Lakes” (Dixon 2010). Dixon’s framing was deliberately polemic, and the explicit contrast he drew was with the data mart, not the data warehouse — the distinction matters historically because the warehouse vs lake framing came later. Dixon’s exact words: “If you think of a datamart as a store of bottled water — cleansed and packaged and structured for easy consumption — the data lake is a large body of water in a more natural state. The contents of the lake stream in from a source to fill the lake, and various users of the lake can come to examine, dive in, or take samples.” The metaphor’s force was the inversion of the curation discipline: instead of paying upfront cost to design schemas and run ETL pipelines before data could be queried, dump the data raw into the lake and let consumers shape it on demand. The warehouse-vs-lake schema-on-write vs schema-on-read framing that now dominates the literature is the natural generalization of Dixon’s mart-vs-lake contrast — warehouses share the data mart’s curation discipline, just at a different scope.
The technical context that made this economically viable was the maturation of the Hadoop ecosystem. Apache Hadoop (Dean & Ghemawat OSDI 2004 for MapReduce; Shvachko et al. MSST 2010 for HDFS, both cited above) had achieved enough operational maturity by 2010-2012 that petabyte-scale schema-on-read storage was practical for the first time. Before Hadoop, schema-on-read was a research curiosity — even storing a petabyte of raw data was prohibitively expensive on the SAN/NAS storage of 2005. After Hadoop, a 1000-node cluster of commodity servers with cheap spinning disks could absorb petabytes for a small fraction of the cost of equivalent enterprise storage. The economics shifted, and “store everything raw” became rational rather than profligate.
The lake’s broader rise was inseparable from three concurrent developments. First, the rise of cloud object storage — Amazon S3 launched 2006 with effectively unlimited capacity and durability guarantees that exceeded HDFS for many use cases, at progressively cheaper rates (0.023/GB/month in 2025). By 2015, the cloud-native lake (S3 + Spark on EMR + Hive Metastore) had eclipsed on-premises Hadoop deployments in greenfield architectures. Second, the explosion of semi-structured and unstructured data sources — clickstream events from web/mobile/server SDKs, sensor data from IoT, logs from containers and Kubernetes, social-media feeds — all of which fit poorly into the rigid schemas of relational warehouses. The lake’s “store everything as-is” promise was specifically motivated by these heterogeneous workloads. Third, the rise of machine-learning workloads — training corpora of millions-to-billions of examples that needed raw data (not pre-aggregated rollups) and benefited from cheap storage of the entire historical record.
The lake metaphor turned out to have a hidden trap that Dixon himself acknowledged in subsequent writings: without governance discipline, a lake degrades into a data swamp — an undocumented dump of files that nobody knows the schema of, ownership of, or freshness of. Daniel Smith’s 2014 piece (and many others) popularized the “swamp” framing as the architecture’s inevitable failure mode without intentional discipline. Bill Inmon — the relational-warehouse pioneer who had been a public skeptic of the lake — wrote a book in 2016 (cited above) titled Data Lake Architecture: Designing the Data Lake and Avoiding the Garbage Dump whose thesis was essentially “the lake works only with the discipline that lakes were initially supposed to liberate you from.” The Bronze/Silver/Gold tiering pattern (popularized by Databricks in the late 2010s as the “medallion architecture”) emerged as the standard discipline for keeping the lake from degrading.
By 2020, the lake’s limitations had motivated the Lakehouse evolution (Armbrust et al., CIDR 2021, cited above; the term itself originated at Databricks). The lakehouse’s insight: layer an open table format over the object-storage files (Apache Iceberg, Delta Lake, Apache Hudi) that provides ACID transactions, schema evolution, time-travel queries, and indexing — features that warehouses had always provided and lakes had lacked. The result is a lake substrate with warehouse-like guarantees, capable of serving both analytical and BI workloads from a single substrate. The 2024+ direction is clearly toward lakehouses; raw Parquet-on-S3 lakes are increasingly seen as 2018-vintage thinking. The 2025-2026 industry trajectory has accelerated this: Iceberg v3 shipped mid-2025 with deletion vectors and row lineage; Delta Lake 4.0 entered preview alongside Apache Spark 4.0 with the Variant semi-structured type, Delta Connect, and Coordinated Commits; major cloud and analytics vendors (Snowflake, Databricks, BigQuery, AWS S3 Tables, ClickHouse) have converged on Iceberg as the cross-vendor lingua franca even when they ship their own native formats. The lakehouse is no longer a research direction; it is the default substrate for new analytical-data platforms.
The interview-relevant point: a candidate who frames the lake as just “S3 with Spark on top” misses the architectural commitment. A candidate who frames it as “the architectural shift from schema-on-write to schema-on-read, made economically viable by Hadoop and cloud object storage, and subsequently refined by lakehouse table formats” demonstrates the historical literacy that interviewers value.
1. When to Use and When Not to Use
A data lake is the right architecture when (a) data sources are heterogeneous (structured, semi-structured, unstructured), (b) downstream consumers are diverse and have not yet been enumerated, (c) ingest velocity must outpace the speed at which schema can be designed, (d) ML and exploratory analytics are first-class workloads (they need raw data, not pre-aggregated rollups), and (e) storage cost dominates the architecture’s cost equation (object storage at $0.02/GB/month vs warehouse storage at 10x or more). The motivating cases are: a clickstream pipeline ingesting tens of millions of events per second from web/mobile/server SDKs in Avro+JSON, a sensor-data platform with ten thousand device types each emitting custom telemetry, a security-event lake collecting heterogeneous logs from hundreds of network and endpoint sources, a feature-engineering substrate where data scientists explore raw events and prototype features before promoting them to a feature store for production serving.
A data lake is the wrong architecture when (a) all consumers want a small number of well-defined structured tables (a warehouse is simpler and faster), (b) data is governance-sensitive — PII, financial records, healthcare data — and the lake’s typical lack of fine-grained access control becomes a compliance liability, (c) query latency is critical (lakes are throughput-optimized; sub-second interactive queries on raw lake data are hard without significant pre-computation), or (d) the team lacks the engineering investment to build the metadata, governance, and quality-monitoring infrastructure that prevents “data swamp” — without that investment, the lake degrades within months.
The acceptance criterion is essentially: do you have heterogeneous data, exploratory consumers, and the engineering investment to keep the lake from becoming a swamp? If yes, a lake. If no — particularly if your data is structured and your consumers are well-defined — a warehouse is simpler. In 2026 most large shops run both: a lake as the raw-data substrate, a warehouse or lakehouse over the curated-and-conformed subset for BI and reporting.
2. Structure
flowchart TB Sources[Data Sources<br/>databases, logs, clickstream,<br/>IoT, third-party APIs] --> Ingest[Ingest Layer<br/>CDC, Kafka, batch loaders] Ingest --> Bronze[(Bronze / Raw Zone<br/>S3 / HDFS<br/>untouched, append-only<br/>JSON, Avro, Parquet)] Bronze --> ETL1[Cleaning + Conform<br/>Spark / dbt] ETL1 --> Silver[(Silver / Refined Zone<br/>cleansed, joined<br/>typed Parquet)] Silver --> ETL2[Aggregation<br/>Spark / dbt] ETL2 --> Gold[(Gold / Curated Zone<br/>business-aggregated<br/>star schemas)] Bronze --> ML[ML Training Pipelines<br/>Spark / TensorFlow / PyTorch] Silver --> Notebook[Data Science Notebooks<br/>exploratory analytics] Gold --> BI[BI Tools<br/>Tableau / Looker / PowerBI] Gold --> Warehouse[Optional: Data Warehouse<br/>Snowflake / Redshift] Catalog[Metadata Catalog<br/>Hive Metastore / Glue / Unity] -. governs .-> Bronze Catalog -. governs .-> Silver Catalog -. governs .-> Gold
What this diagram shows. The architecture’s defining property is the multi-zone tiering of data by curation level, often called the medallion architecture (Bronze / Silver / Gold) — a Databricks-popularized naming, though the underlying pattern predates the term. Bronze is the raw landing zone: data arrives untouched, append-only, in whatever format the source emitted (JSON, Avro, Parquet, CSV, custom binary). The promise is “no transformation required to ingest” — schema-on-read at its most literal. Silver is the cleansed, conformed, joined zone: cleaning logic (deduplication, type coercion, standardization of categorical values, joins across source systems) has been applied. Silver is what most analysts and data scientists query. Gold is the business-aggregated zone: pre-computed star schemas, pre-aggregated metrics, the “ready for BI tool consumption” form. Each tier has higher curation, lower volume, and higher quality than the tier below it.
The metadata catalog (Hive Metastore historically, AWS Glue or Databricks Unity Catalog today, or open-source alternatives like Apache Atlas) is the lake’s necessary backbone: it tracks what tables exist, what their schemas are, where their files live, who can access them, and how they relate. Without a working catalog, the lake is just a pile of files — the catalog is what makes it a queryable system.
The data flow is one-way: Bronze → Silver → Gold. Each transformation is implemented as a Spark job, dbt model, or streaming pipeline; each output is written to its own location. Critically, raw Bronze data is preserved indefinitely (or per regulatory retention) — this is the lake’s “we can recompute everything” guarantee, parallel to the immutability principle in Lambda Architecture §3.
3. Core Principles
Principle 1 — Schema-on-read. Data is stored in its source-emitted form; schema interpretation happens at query time. This decouples ingest velocity from schema design velocity. A new event type can land in Bronze tomorrow without any upstream schema-registry coordination; consumers handle the new shape when they choose to.
Principle 2 — Cheap storage as the architectural permission slip. Object storage at 0.001/GB/month for archive (S3 Glacier Deep Archive) makes “store everything raw” economically rational. The economics of the lake are inseparable from the economics of cloud object storage; you cannot reproduce the lake economics on attached SSD.
Principle 3 — Tiered curation. The Bronze/Silver/Gold tiering enforces discipline: raw data is preserved untouched (Bronze), cleansed data is the analyst’s working substrate (Silver), curated data feeds production reporting (Gold). The discipline prevents the common failure mode where the same dataset is “cleaned” by multiple downstream consumers in subtly different ways.
Principle 4 — Storage and compute decoupled. Files in object storage; compute via Spark, Trino, Athena, or whatever engine fits the query. Scale storage independently of compute. This is a sharp departure from warehouses (Vertica, Teradata) which historically tied storage and compute on the same nodes. Cloud-native warehouses (Snowflake, BigQuery, Redshift Serverless) have since adopted this decoupling — convergence between lake and warehouse continues.
Principle 5 — Open file formats. Parquet (columnar, self-describing, compressed) and Avro (row-oriented, schema-evolving) are the de facto standards. Open formats prevent vendor lock-in and enable multi-engine access (Spark for ETL, Trino for ad-hoc SQL, ML frameworks for training, all reading the same files).
Principle 6 — Catalog-as-truth. The metadata catalog defines what data exists; without an entry in the catalog, the data is invisible. Even physically present files in S3 are “outside the lake” if not registered. This is the necessary discipline that prevents the swamp.
3.1 The medallion architecture in concrete operational terms
The Bronze/Silver/Gold tiering — popularized by Databricks circa 2018 as the “medallion architecture” though the underlying pattern predates the term — is best understood not as a marketing label but as a specific operational discipline that prevents the lake from degrading. Each tier has explicit retention, access patterns, write semantics, and consumer expectations.
Bronze (raw / landing zone). Data lands here exactly as it was emitted by the source — no schema enforcement, no deduplication, no cleaning. Format is whatever the source produced (JSON, Avro, Parquet, CSV, raw HTTP request bodies). Storage layout is partitioned by ingest date and source: s3://lake/bronze/source=clickstream_web/ingest_date=2026-05-09/hour=14/part-NNNN.json.gz. Retention is governed by regulation and source-system constraints — typically 1-7 years, sometimes indefinite for compliance-mandated raw event records. Access pattern: rare, ad-hoc, primarily for debugging or backfilling Silver. Bronze is “the source of truth” — if Silver has a bug, you can recompute Silver from Bronze. Bronze data is never modified after landing; corrections come as new Bronze records with later timestamps.
Silver (cleansed and conformed). Data has been cleaned — deduplicated, type-coerced (the JSON "123" becomes the integer 123), categorical values standardized ("US", "USA", and "United States" all become "USA"), PII redacted or hashed, joins to reference data applied (a clickstream event with country_code=US joined against the countries reference to add country_name=United States). Format is typed Parquet with explicit schema. Storage is partitioned by event date (not ingest date — Silver normalizes to event-time): s3://lake/silver/events/event_date=2026-05-08/part-NNNN.parquet. Retention is shorter than Bronze (typically 1-3 years). Access pattern: dominant analyst workload — most ad-hoc queries and notebooks query Silver. ETL from Bronze to Silver runs hourly or daily; consumers expect Silver to lag Bronze by hours, not days.
Gold (business-aggregated and curated). Pre-computed star schemas, fact tables joined with dimension tables, business-grade aggregates ready for direct BI consumption. Format is highly-typed Parquet or even pushed into a warehouse (Snowflake, BigQuery) for low-latency BI access. Storage layout follows star/snowflake schemas with explicit fact_* and dim_* tables. Retention is long (5+ years for trend analysis). Access pattern: BI dashboards, executive reports, regulated reports. Gold tables typically have explicit ownership (a designated team responsible for the dataset’s correctness) and explicit SLAs (refreshed by 06:00 UTC daily, with quality checks gating publication).
The retention and replay logic. Bronze’s role is to enable recomputation: if Silver or Gold has a bug, replay from Bronze. This is exactly the same principle as Lambda’s master dataset (see Lambda Architecture §3) and Kappa’s durable log (see Kappa Architecture §3). The lake is therefore structurally a Lambda/Kappa-style “log + materialized views” architecture, with Bronze as the log and Silver/Gold as the materialized views. The architectural similarity is one of the points the lakehouse paper (Armbrust et al. CIDR 2021) makes explicit — the streaming and batch worlds have converged on the same fundamental pattern: immutable raw data + derived materialized views.
Operational discipline that the medallion architecture enforces. Without Bronze/Silver/Gold tiering, the typical failure mode is that consumers query Bronze directly (because it’s the only zone), each consumer re-derives the same cleaning logic in their own notebooks, the cleaning logic drifts across consumers, and quality becomes inconsistent. The tiering forces a single canonical “cleansed” view (Silver) that all consumers share. The discipline is not the existence of three folders; it is the existence of three contracts — Bronze for raw fidelity, Silver for cleansed fidelity, Gold for business-grade aggregates — each with its own owners, SLAs, and consumers.
4. Request Flow
4.1 Ingest path
sequenceDiagram participant Source as Data Source participant Ingest as Ingest Service participant Bronze as Bronze Zone (S3) participant Catalog as Metadata Catalog Source->>Ingest: stream events / batch dump Ingest->>Ingest: validate, partition by date/source Ingest->>Bronze: write Parquet/Avro files Ingest->>Catalog: register new partition / table Note over Bronze: data immediately queryable
Ingest is intentionally minimal: validate, partition (by ingest date and source typically), write. No schema enforcement, no transformation. The catalog registration is the one piece that lifts the data into “queryable” status.
4.2 Query path (analyst on Silver / Gold)
sequenceDiagram participant Analyst participant Engine as Query Engine<br/>(Spark / Trino / Athena) participant Catalog participant S3 as Object Storage Analyst->>Engine: SELECT ... FROM silver.events WHERE date = '2026-05-08' Engine->>Catalog: resolve table → file list, schema Catalog-->>Engine: partition pruning info, schema Engine->>S3: parallel read of relevant Parquet files S3-->>Engine: column chunks (only requested columns) Engine->>Engine: predicate pushdown, aggregation Engine-->>Analyst: result
The query path’s defining feature is partition pruning + column projection + predicate pushdown, all enabled by Parquet’s columnar layout and the catalog’s partition metadata. A query touching one day of data over one column reads a small fraction of the table — making “scan the entire raw table” tolerable for analyst-scale queries.
4.3 Curation pipeline (Bronze → Silver → Gold)
sequenceDiagram participant Scheduler as Airflow / dbt participant Spark as Spark / dbt-Spark participant Bronze participant Silver participant Gold participant Catalog Scheduler->>Spark: nightly job: refine Bronze → Silver Spark->>Bronze: read raw events Spark->>Spark: clean, deduplicate, type-cast, join Spark->>Silver: write Parquet (atomic via temp + rename) Spark->>Catalog: update Silver partition Scheduler->>Spark: subsequent job: aggregate Silver → Gold Spark->>Silver: read cleansed Spark->>Spark: aggregate to star schema Spark->>Gold: write Parquet Spark->>Catalog: update Gold partition
The curation pipelines are typically scheduled batch jobs (Airflow + Spark, dbt) or streaming jobs (Spark Structured Streaming, Flink) writing into the next tier. Atomicity at the file-level is achieved via write-temp-then-rename; atomicity at the table level requires a table format like Iceberg or Delta (see §5).
5. Variants
Hadoop / HDFS lakes (the OG). Data lives on the Hadoop Distributed File System (Shvachko et al., MSST 2010, cited above), processed by MapReduce (Dean & Ghemawat, OSDI 2004), Hive, or Spark. Schema cataloged in Hive Metastore. Dominant 2010–2018; gradually replaced by cloud lakes as object storage became cheaper and more durable than HDFS.
Cloud object-storage lakes (S3, GCS, ABS). Data lives in object storage; metadata in AWS Glue Catalog, Google Dataplex, or Azure Purview. Compute via Spark on EMR, Trino, Athena, BigQuery (over external tables), Snowflake (over external tables). The dominant 2020+ form.
Lakehouse (Iceberg / Delta / Hudi). A table format layered over object-storage files: ACID transactions (atomic appends, atomic schema changes), time travel (query as-of a past snapshot), schema evolution, hidden partitioning, indexes. Delta Lake (Armbrust et al., VLDB 2020), Apache Iceberg, Apache Hudi are the three major open formats. The lakehouse paper (Armbrust et al., CIDR 2021) argues that table formats close the gap between lake and warehouse, allowing one substrate to serve both. This is the dominant 2024+ direction.
The three table formats have different design centers worth understanding. Apache Iceberg was started at Netflix in 2017 by Ryan Blue and Dan Weeks to overcome scalability and consistency limitations of Apache Hive tables, donated to the Apache Software Foundation in November 2018, and graduated to a top-level Apache project in May 2020 (Apache Iceberg — Wikipedia). Iceberg emphasizes schema evolution and partition evolution — the partition spec can change over time and Iceberg tracks per-snapshot which spec applies to which files. Iceberg’s metadata is hierarchical (snapshot file → manifest list → manifest → data files), enabling efficient pruning at multiple levels. Iceberg has the broadest engine support (Spark, Trino, Flink, Snowflake, BigQuery, Athena, ClickHouse) and is the de facto industry standard for new deployments. The spec has evolved across three versions: v1 (initial), v2 (added row-level deletes via positional and equality delete files — the basis for tractable GDPR right-to-be-forgotten on lakes), and v3 (officially approved by the Iceberg community in mid-2025, with AWS support across Spark on EMR 7.12, Glue, S3 Tables, and SageMaker landing November 26, 2025 per AWS 2025). Iceberg v3 introduces two headline features: deletion vectors (a Puffin-encoded binary format that consolidates per-row deletions into a single deletion vector per data file, replacing v2’s per-row positional delete files and dramatically reducing read-side merge cost), and row lineage (every row carries a _row_id and _last_updated_sequence_number, enabling efficient change-data-capture queries against the table without full-scan diffs — a feature warehouses have historically required external tooling for). The v3 evolution is the most significant lakehouse-format change since Iceberg v2’s row-level deletes; shops handling petabytes of upsert-heavy or CDC-driven data should be migrating to v3 connectors as engine support lands.
Delta Lake (originally Databricks, open-sourced 2019, currently at the Delta Lake 4.0 preview alongside Apache Spark 4.0 preview per delta.io 4.0 notes) emphasizes ACID transactions via a transaction log (_delta_log/) that records every operation; Delta’s protocol is simpler than Iceberg’s hierarchical metadata but has historically been most deeply integrated with Databricks Spark. Delta Lake 4.0 introduces several large changes: Variant type (semi-structured data support with schema flexibility and high performance — addressing the JSON-blob-in-Parquet pain), Delta Connect (a client-server architecture analogous to Spark Connect, enabling remote connectivity and easier version upgrades), Coordinated Commits (a centralized commit service managing multi-cloud, multi-engine writes without filesystem-coordination dependencies — historically a Delta limitation on object stores with weak rename semantics), and Type Widening (allowing INT→LONG and similar evolutions without table rewrites). Delta’s ecosystem also expanded via Delta Kernel-based connectors (DuckDB, Druid, Flink) and delta-rs 1.0 (the Rust implementation reaching stability). The 4.0 release positions Delta as a stronger alternative to Iceberg, though as of 2026 Iceberg has broader cross-vendor adoption.
Apache Hudi (originally Uber) emphasizes upsert-heavy workloads with two table types: copy-on-write (rewrite affected files on each update — better for read performance) and merge-on-read (write a delta file, merge at read time — better for write-heavy workloads). Hudi is most popular for change-data-capture into lake patterns where upserts are frequent.
Cross-format choice in 2026: Iceberg dominant for greenfield with broad cross-vendor support (Snowflake, BigQuery, Databricks, AWS, ClickHouse, Trino, Flink), Delta common in Databricks shops and growing as Delta Connect lands, Hudi for upsert-heavy CDC-specific patterns. Some shops standardize on one; others mix based on workload. Cross-engine portability is increasingly real (the Iceberg REST catalog spec is supported by multiple vendors), reducing the lock-in concern that historically argued against picking any one format. The recent industry direction — Snowflake’s Polaris, Databricks’ Iceberg interop, AWS S3 Tables — is convergence on Iceberg as the lingua franca even within ecosystems that previously favored a different format.
Snowflake’s external tables. Snowflake originally was a pure warehouse but added external-table support over S3 — Snowflake compute over lake files. Convergence: warehouses growing toward lakes, lakes growing toward warehouses.
BigQuery + GCS. Similar pattern: BigQuery as compute, with native managed storage and external tables over GCS. The “BigLake” feature is GCP’s lakehouse equivalent.
Multi-cloud lakes. Some shops run lakes spanning AWS S3 + GCP GCS + Azure ABS, federated by a single catalog. Iceberg’s REST catalog spec is the modern enabler.
Domain-oriented lake (data mesh substrate). Each domain owns a piece of the lake; the platform team provides shared catalog and infrastructure. This is the Data Mesh Architecture applied to a lake substrate; covered separately.
6. Real-World Examples and Citations
Netflix’s data platform. Netflix runs one of the largest publicly-described data lakes — public talks (and open-source contributions like Apache Iceberg, originally a Netflix project started by Ryan Blue and Dan Weeks in 2017, donated to the ASF in November 2018, and graduated to top-level Apache project status in May 2020) describe an S3-based lake with Iceberg as the table format, Spark for ETL, Presto/Trino for ad-hoc SQL, Apache Druid for low-latency analytics. The lake holds the full event history (clickstream, viewing telemetry, recommendations) used for both analytics and ML training. The Iceberg project’s origins are illuminating: Netflix engineers found that the Hive metastore’s listing-based semantics (Hive tables defined by a list of S3 partitions, with rename-based atomicity that broke under S3’s then-eventual consistency — S3 became strongly read-after-write consistent in December 2020, but the listing-as-truth problem persisted for table-level operations) caused real production incidents where queries returned partial results during table updates. Iceberg’s table-format abstraction — explicit snapshot files, atomic snapshot pointer updates — fixed this. The fact that this required a new project to build is itself evidence of the lake’s governance gap and the lakehouse evolution’s necessity. Netflix’s lake supports analytics, ML training (their recommendation system trains on years of viewing data from the lake), A/B test analysis, and content investment decisions — all from the same substrate, with different consumers using different access patterns.
Apple’s deployment of Iceberg. Apple has been a substantial Iceberg user since around 2020, with engineers contributing to the open-source project. Public talks describe Iceberg adoption across multiple business lines for analytics workloads, with the table format providing the ACID guarantees that the Hive-based lake had lacked.
Capital One’s enterprise lake. Capital One was an early adopter of cloud-based data lakes (AWS-centric) for credit-card analytics, fraud detection, and regulatory reporting. Public engineering posts describe the Bronze/Silver/Gold tiering with explicit governance for PCI-compliant workflows.
Uber’s Hudi-based lake. Apache Hudi originated at Uber to handle their fast-changing dimension data (rider/driver state, trip events). Public engineering blog posts describe a multi-petabyte lake on S3/HDFS with Hudi for upsert support, Spark for processing, Presto for SQL.
LinkedIn’s lake + Pinot. LinkedIn runs a lake substrate over HDFS for analytics, with Apache Pinot serving sub-second OLAP over the curated portion. Public talks describe the Bronze/Silver/Gold tiering pattern.
Databricks Lakehouse customers. Databricks markets the lakehouse pattern aggressively; customers including Comcast, Block (Square), Shell, and many Fortune 500 firms run Delta Lake-based lakehouses. Architecture details are public via Databricks case studies.
AWS Lake Formation. AWS’s managed lake offering: combines S3 storage, Glue catalog, fine-grained access control, and ETL orchestration. Used by many enterprises as a turnkey lake substrate.
Snowflake’s external-table customers. Many shops run Snowflake compute over an S3 lake with parquet files, treating Snowflake as the lake’s query engine and the warehouse for the curated subset. Effectively a hybrid lake-warehouse.
Cloud-managed lake offerings. AWS Lake Formation provides Glue catalog + S3 + fine-grained access control + ETL orchestration as a turnkey lake. Azure Data Lake Storage Gen2 provides hierarchical-namespace object storage optimized for analytics workloads, integrated with Azure Synapse for compute. Google BigLake provides BigQuery’s query engine over GCS-resident files, with metadata governed by Dataplex. Each cloud’s managed lake is a packaging of the underlying object store + a catalog + a query engine into a coherent product. Adoption: most enterprises run their lake on the cloud-managed offering of their primary cloud rather than building from open-source components, even though the open-source equivalents (S3 + Iceberg + Spark + Trino) are competitive.
Uncertain
Verify: the specific scale numbers in the case studies above — e.g., the precise petabyte counts at Uber’s Hudi lake, the exact configurations at Capital One, the precise file counts at Netflix. Reason: these come from conference talks and engineering posts of varying recency, and many were stated as point-in-time figures that have since drifted. The fact of these lakes’ existence and architectural shape is well-established; the precise quantitative shape varies year to year. To resolve: cross-check against the most recent conference talks (Strata, Data + AI Summit, QCon) for each company; treat any specific volume claim as approximate unless dated. #uncertain
6.1 Worked example — a 5-year-old e-commerce company’s lake
To make the medallion architecture and the lake’s tradeoffs concrete, walk through what a typical 5-year-old e-commerce company’s lake might look like at scale — the kind of scale where the lake’s strengths and pain points become visible.
The company. A direct-to-consumer apparel company, ~5 years old, ~500 employees, ~$200M annual revenue, ~10M monthly active customers, ~100M total customer accounts. Engineering team of ~150, of which ~10 are in data engineering. Operating Postgres (orders, inventory, customer accounts), MongoDB (product catalog with variable attributes), Elasticsearch (product search), Redis (sessions, cart), and Stripe + various third-party integrations. The data team has been asked to build a lake to support ML personalization, supply-chain optimization, marketing analytics, and executive reporting.
Bronze (raw). Sources feeding Bronze:
- Postgres CDC. Debezium captures every row change in Postgres (orders, customers, inventory) and produces to Kafka. A Kafka Connect S3 sink writes the events to Bronze every 5 minutes in compact Avro batches. Volume: ~5 GB/day of order events, ~1 GB/day of customer events, ~10 GB/day of inventory events. Storage path:
s3://lake/bronze/postgres/topic=orders/ingest_date=2026-05-09/hour=14/part-NNNN.avro. - MongoDB CDC. MongoDB change streams capture product catalog updates; same pattern via Kafka Connect to S3. Volume: ~500 MB/day, mostly product attribute updates.
- Clickstream events. A Snowplow-derived ingest pipeline collects ~100M events/day from web/mobile/server SDKs (page views, product views, cart actions, checkouts) into Kafka, then to Bronze. Volume: ~100 GB/day of compressed Avro.
- Marketing platform events. Email opens, ad-platform impressions/clicks, attribution data from Snowflake’s marketing-platform integrations. Volume: ~10 GB/day.
- Third-party logs. Stripe webhook events, Twilio SMS receipts, shipping carrier events. Volume: ~1 GB/day.
Total Bronze ingest: ~115 GB/day → ~42 TB/year, growing. After 5 years of growth, Bronze is ~150 TB total. With S3 Standard at 3,500/month for Bronze storage alone. Tiering older partitions to S3 Glacier Deep Archive ($0.001/GB/month) for partitions older than 1 year cuts the cost substantially — most of the 150 TB ages into cold tier.
Silver (cleansed). Daily Spark jobs (orchestrated by Airflow) read Bronze, deduplicate (idempotency keys for events that may have been delivered multiple times), type-coerce (parsing event timestamps from various source formats into UTC ISO 8601), redact PII (hash email addresses, redact IP addresses according to GDPR rules), join to reference data (country code → country name, IP → geo location via MaxMind, currency conversion to USD), and write Parquet to Silver. Storage path: s3://lake/silver/events/event_date=2026-05-08/event_type=page_view/part-NNNN.parquet. Silver is partitioned by event date and (for events) event type, enabling efficient partition pruning. Volume: Silver is ~20% smaller than Bronze due to dedup and column elimination, ~30 TB/year, ~120 TB total over 5 years. Retention: 3 years before tiering to Glacier.
Gold (business-aggregated). dbt models compute the daily/weekly/monthly aggregates that the business cares about: daily revenue by product category, customer cohort retention, product attach rates, marketing campaign ROAS, inventory turnover. These are written as Parquet star schemas in Gold. Volume: small — ~100 GB total — because aggregates compress millions of events into single rows. Retention: 5+ years for executive dashboards.
ETL pipeline. Airflow orchestrates: hourly Bronze validation jobs (schema checks, completeness checks); daily Bronze → Silver Spark jobs (~3 hours of compute on a 100-core cluster); daily Silver → Gold dbt models (~30 minutes); ad-hoc reprocess jobs when bugs are discovered.
Consumers.
- BI dashboards (Tableau, Looker) query Gold via a Trino cluster federating across Snowflake-loaded Gold tables and lake-resident Silver tables for drill-down.
- Data scientists query Silver via Jupyter notebooks running PySpark on Databricks; ML training pipelines read Silver for historical feature generation.
- Recommendation system consumes specific Silver-tier event streams via a separate streaming pipeline (Kappa-aligned) for online feature computation.
- Marketing analytics consume Gold via SQL access in BigQuery, with dbt models managing the BigQuery-side transformations.
Cost breakdown (rough estimates).
- S3 storage: ~$5K/month total (mostly tiered).
- Spark/EMR compute for ETL: ~$30K/month.
- Trino cluster for ad-hoc query: ~$15K/month.
- Snowflake/BigQuery for Gold-tier serving: ~$20K/month.
- Catalog (Glue): ~$2K/month.
- Total: ~840K/year for the lake substrate.
Pain points at this scale.
- Small-file problem in Bronze clickstream. 100M events/day landing every 5 minutes produces ~30K small files/day in Bronze. Compaction jobs run daily to merge into ~128 MB files; without compaction, Spark job startup time dominates.
- GDPR right-to-be-forgotten. When a customer requests deletion, the affected rows are scattered across years of Parquet files. Without a lakehouse table format, this requires scanning all files for the customer ID, rewriting the affected files, and reconciling with the catalog. With Iceberg or Delta, row-level deletes are tractable. The team’s GDPR adoption was the primary motivator for migrating to Iceberg in year 4.
- Cost surprise from poorly-partitioned tables. A junior analyst writes
SELECT count(*) FROM events WHERE event_type='page_view'without a date filter, scanning the entire 30 TB events table — $150 in BigQuery cost for one query. Mitigation: query review tooling, mandatory partition predicates enforced by the platform. - Schema drift. When the mobile team adds a new field
device_battery_levelto clickstream events, downstream Silver pipelines either silently swallow the change or fail. Schema-registry (Confluent Schema Registry) discipline at the producer side fixes this; without it, schema drift produces production incidents. - Multiple sources of truth for “active customer.” Marketing has one definition; finance has another; product has a third. The Gold layer is supposed to canonicalize, but in practice three different Gold tables embody three different definitions. Mitigation: an explicit data-product owner per definition, with documentation calling out the boundaries.
This worked example illustrates why “build a data lake” is not a one-quarter project — it is a multi-year program of platform engineering, governance discipline, and organizational change. The architectural decision (S3 + Iceberg + Spark + Trino + Snowflake/BigQuery) is the easy part; the operational discipline that prevents swamp formation is the hard part, and is what distinguishes successful lake deployments from failed ones.
7. Tradeoffs
| Dimension | Data Lake | What you get | What it costs |
|---|---|---|---|
| Schema flexibility | High (schema-on-read) | Heterogeneous data, fast ingest | Re-derive schema on every query |
| Storage cost | Very low (object storage) | Petabyte retention is feasible | Object storage I/O is slower than block |
| Query latency | Throughput-optimized | Excellent for analytical scans | Sub-second queries are hard |
| Governance | Weak by default | Maximum flexibility | Compliance is hard; “data swamp” risk |
| Engine choice | Open (Spark, Trino, Presto, Athena) | No vendor lock-in | Multiple engines = multiple ops surfaces |
| Update support | Append-only by default | Simple semantics | Updates require Iceberg/Hudi/Delta |
| ACID transactions | Not native | Cheap and parallel writes | Table-format layer required |
| Use cases | Analytics, ML, exploratory | Broad fit | Not for transactional workloads |
| Cataloging | Critical, often weak | Universal access if done right | Without catalog, swamp is inevitable |
| BI tooling | Indirect (via Trino/SQL engine) | Works | Higher latency than warehouse |
The fundamental tradeoff a lake makes is flexibility at write time in exchange for cost at read time. A warehouse pays the cost upfront (ETL, schema design, structured storage) and reaps it at query time (fast, predictable, governed). A lake defers the cost (cheap ingest, no schema discipline) and pays it at query time (re-derive schema, scan more bytes, governance debt). The right choice depends on whether you know your queries in advance — if yes, warehouse; if no (and you accept the governance investment), lake.
7.1 The economics of the lake
The lake’s appeal rests on cost economics that are worth making explicit.
Object storage at scale. Amazon S3 Standard pricing as of 2025 is approximately 0.021/GB/month at petabyte scale. S3 Glacier Deep Archive (cold storage with retrieval times of hours) is ~25/TB/month for storage plus compute charges per query. The lake’s storage-only cost is 50-100x cheaper per GB than warehouse-attached storage.
Compute economics. Lake compute (Spark on EMR, Athena, Trino, BigQuery on external tables) is paid per-query or per-cluster-hour. At 0.10/TB-second of cluster time (EMR), heavy analytics workloads run hundreds to thousands of dollars per day. The compute cost is typically higher than warehouse compute because the warehouse has indexed and pre-aggregated forms; the lake forces full scans more often.
Total-cost crossover. For workloads with petabytes of cold data and infrequent queries, the lake wins decisively (storage cost dominates; cheap storage + occasional compute beats expensive integrated storage+compute). For workloads with terabytes of hot data and constant queries, the warehouse wins (compute optimization dominates; integrated storage + compute is more efficient than lake reads). The crossover is roughly: if your storage:query-cost ratio favors storage by more than ~5x, the lake is cheaper; if it favors compute by more than ~5x, the warehouse is cheaper.
Why this matters for architecture. The lake’s economics make “store everything raw” rational. With integrated warehouses, the cost discipline is “only store what you need” — which forces ETL filtering and information loss. With lakes, the discipline shifts to “store everything; filter at query time” — which preserves optionality for future use cases.
8. Migration Path
Migration into a lake from a legacy warehouse. The standard recipe:
- Stand up object storage as the new lake substrate. Configure a metadata catalog (Glue, Hive Metastore, Unity, or Iceberg REST catalog).
- Replicate raw data sources into Bronze (CDC from operational databases, batch dumps from legacy warehouses, streaming from event sources).
- Implement Bronze → Silver curation pipelines using Spark / dbt; replicate the legacy warehouse’s logic.
- Validate Silver against the legacy warehouse’s outputs for overlapping queries.
- Migrate downstream consumers (BI tools, ML pipelines, analyst notebooks) to read from Silver/Gold.
- Decommission the legacy warehouse or keep it as a Gold-zone consumer.
The migration is typically incremental and table-by-table, taking quarters to years. The most common stalling point is step 4 (validation) — finding subtle differences between the legacy warehouse’s outputs and the new lake’s outputs and reconciling them takes longer than expected. Common sources of difference: different timezone handling, different rounding rules, different null-handling conventions, different deduplication logic. Each difference requires investigation and either fixing the lake to match or documenting the intentional change.
Migration toward a lakehouse. Adopt a table format (Iceberg, Delta, Hudi) over the existing Parquet files in the lake. Most of these formats are layered on top of plain Parquet; migration is “register the existing files as an Iceberg/Delta table” with metadata initialization. Then enable ACID, schema evolution, time travel features as needed. The migration is typically incremental — start with the most-volatile or compliance-sensitive tables (where ACID transactions and time travel are most valuable), expand to other tables as confidence grows. Common pitfall: assuming the migration is purely “register the table” — in practice, query engines need updated connectors, ETL pipelines need updates to use the table-format-specific APIs (MERGE INTO for upserts), and operational procedures (compaction, snapshot expiration) need to be implemented. Budget months, not weeks, for the migration.
Migration out of a lake into a warehouse. Rare in 2026 but possible for shops realizing they don’t actually have heterogeneous data and don’t need exploratory analytics. The recipe: identify the curated Gold tables, replicate them into the warehouse, decommission the lake compute (keep Bronze as cold archive). This is essentially “the curated Gold tables were the warehouse all along; the lake substrate was overhead.”
9. Pitfalls
Data swamp. The most-cited failure mode. A lake without metadata governance, ownership, lifecycle management, and quality monitoring degrades into an undocumented dump of files. Symptoms: nobody knows which table is authoritative for a metric, multiple slightly-different “user_events_v2” tables proliferate, retention policies are inconsistent, consumers fork the same data into private staging copies. Mitigation: catalog discipline from day one, mandatory ownership metadata, automated quality monitoring, dataset lifecycle policies. Inmon (2016, cited above) wrote a book primarily about this anti-pattern.
Schema drift across producers. Bronze accepts whatever the source emits. When the source changes its schema (a new field, a renamed field, a type change), downstream curation pipelines either (a) silently swallow the change and produce wrong results or (b) fail loudly. Mitigation: schema registry (Confluent Schema Registry, Apicurio) with backward-compatibility checks at the source side; schema evolution rules enforced via the table format (Iceberg’s schema-evolution spec is the modern standard).
Petabyte-scale GDPR right-to-be-forgotten. A user requests deletion. With raw events scattered across years of Parquet files, finding and rewriting the affected files is hours-to-days of work and millions of file rewrites. Lakehouse formats (Iceberg, Delta) make this tractable via row-level upsert + compaction; raw Parquet lakes do not. Compliance is a primary motivator for lakehouse adoption. Concretely: a deletion request against a 5-PB Parquet lake might require scanning 50,000 files (~100 GB each) to find the affected rows, then rewriting each affected file with the row removed — many hours of compute and thousands of dollars of cluster cost per deletion request. Iceberg v2 added row-level deletes via positional and equality delete files (each delete recorded as a small companion file that the read path merges with the base data files), making deletion tractable but requiring delete-file consolidation at read time. Iceberg v3 (mid-2025) introduces deletion vectors — a single Puffin-encoded binary vector per data file that consolidates all that file’s deletes, dramatically reducing read-side merge cost and eliminating the per-row positional delete-file overhead that v2 incurred (per AWS 2025). Delta Lake’s DELETE statement and Hudi’s record-level updates provide analogous capabilities. The right-to-be-forgotten use case has effectively forced lakehouse adoption at every regulated enterprise; raw Parquet lakes are no longer a practical choice for personal-data-handling workloads, and v2 lakes should be migrating to v3 deletion vectors as engine support lands.
Query performance without indexes. Parquet’s columnar layout helps with column projection and predicate pushdown; but without secondary indexes (which Parquet lacks natively), queries that are not aligned with the partition key scan large amounts of data. Mitigation: choose partition keys carefully, use Iceberg’s hidden partitioning + Z-ordering for multi-dimensional locality, materialize common aggregations into Gold.
Format zoo when teams choose differently. One team writes Avro, another Parquet, a third JSON, a fourth a custom binary format. Curation pipelines bloat with format-handling code; ad-hoc analyst queries fail unpredictably. Mitigation: platform-wide format standards (Parquet for analytical, Avro for streaming row-by-row, JSON only for unstructured edge cases). The platform’s role is enforcement: registration in the catalog should require a format declaration, and non-standard formats should require explicit justification.
Lake compute is “expensive on each query” while warehouses amortize. Each lake query pays the cost of opening files, reading headers, applying predicates, deserializing — overhead that warehouses amortize in their managed storage layer. A query that runs a thousand times per day pays the lake overhead a thousand times. Mitigation: cache hot query results (Athena’s query result caching, Trino’s query plan caching), pre-aggregate into Gold for hot patterns, materialize common views as physical tables.
Producer schema evolution timing. When a producer adds a field, downstream consumers may not pick it up for hours-to-days depending on ETL cadence. Reports during the lag period miss the new field. Mitigation: schema-aware producers, consumer-driven contract testing, explicit schema evolution coordination between producer and consumer teams.
Catalog fragmentation. Some tables are in the Hive Metastore, others in Glue, others discovered by scanning S3 buckets directly. Cross-engine consistency is broken. Mitigation: one canonical catalog per environment; enforce that all queries go through it.
Small-file problem. Streaming ingest produces many tiny files (one per micro-batch). Parquet’s overhead per file dominates the storage cost; query performance collapses (one file per S3 GET, latency-bound). Mitigation: periodic compaction jobs (Iceberg / Delta have compaction commands), or batched ingest with sized output files (~128MB-1GB target).
Cost surprise from query bytes scanned. Athena and BigQuery on external tables charge per-byte-scanned. A poorly-partitioned table queried frequently can run up bills of thousands of dollars per day. Mitigation: partition pruning, column projection, query review tooling, cost alerting.
Bronze as a permanent storage instead of a transient raw zone. Some teams use Bronze as the only zone, never building Silver/Gold. Every consumer re-derives the same cleaning logic; quality drifts. Mitigation: make Silver/Gold first-class; review whether each Bronze table has a Silver counterpart.
Compute lock-in despite open storage. “Open file formats prevent vendor lock-in” is true of storage, but Spark vs Trino vs Athena vs Snowflake have different SQL dialects, performance characteristics, and operational profiles. Migration between engines is non-trivial even when files are in open formats.
Cross-region replication cost. A multi-region lake means cross-region S3 replication; for petabytes, this is expensive. Mitigation: per-region lakes federated via catalog; cross-region ETL only for the curated subset.
Engine version drift. Spark 3.x, Trino 4.x, Athena, Snowflake — each engine has its own SQL dialect, optimizer characteristics, and version-evolution cadence. A query that runs in Spark may fail in Trino due to subtle dialect differences. Mitigation: standardize on a primary query engine for analytics; treat secondary engines as read-only with documented compatibility.
Catalog as a single point of failure. When the metadata catalog is unavailable, the entire lake is effectively offline — engines cannot resolve table schemas or partition lists. Mitigation: high-availability catalog deployment, with replication and failover; catalog-aware retry logic in client engines.
Lakehouse table format mixing. A team adopts Iceberg for some tables, Delta for others, plain Parquet for the rest. Cross-table queries become engine-specific (Spark with Delta libraries, Trino with Iceberg connectors, etc.). Mitigation: standardize on one table format per environment unless a specific reason exists for diversity. In practice, mixed-format lakes happen when different teams or different acquired companies arrive with different format choices; consolidation is then a multi-quarter migration project.
The “hot path” lake mismatch. Lakes are throughput-optimized, not latency-optimized. A query that needs sub-100ms response time will not get it from a lake — Parquet read overhead, S3 latency, and engine startup all contribute to seconds-not-milliseconds query latency. Mitigation: don’t put hot-path workloads on the lake. Pre-aggregate into a low-latency store (Druid, ClickHouse, Pinot, Redis, or a warehouse with materialized views).
Compaction blocking writes. Iceberg/Delta compaction is heavy: it rewrites data files to merge small files and apply pending deletes. Naive compaction blocks writes during the rewrite. Modern formats support concurrent compaction (writers proceed against new snapshots while compaction works on old ones), but the operational model still requires care.
Compaction lag. Iceberg / Delta require periodic compaction to merge small files and clean up stale snapshots. If compaction falls behind ingest, query performance degrades and storage costs grow. Mitigation: dedicated compaction jobs, monitored separately from the main ETL.
Time-travel storage growth. Lakehouse formats support time-travel queries (read the table as-of a past snapshot). The storage cost grows with snapshot retention; if retention is unbounded, the table grows unboundedly. Mitigation: explicit snapshot expiration policies, balance audit-trail needs against storage cost.
Schema-on-read promise vs query-time reality. Schema-on-read is cheap to ingest because no schema design is required upfront — but every query must re-derive the schema from the data, which has substantial cost. Parquet’s column projection and predicate pushdown mitigate this for well-partitioned tables; but for queries that don’t align with the partition key, full scans are required, and “scan a year of data to find one record” produces cost surprises. The schema-on-read promise was that ingestion was cheap; the query-time reality is that queries can be expensive in proportion to how poorly they align with the storage layout. Mitigation: thoughtful partitioning, secondary indexing where supported (Iceberg’s bloom filters, Delta’s data skipping), pre-aggregation into Gold for hot query patterns.
The “data lake as cold storage for warehouse overflow” anti-pattern. Some shops use the lake as cheap storage for data that doesn’t fit in their warehouse — but treat the lake as a backup rather than as a queryable substrate. The data is in S3 but is never queried, never validated, never integrated into analytics workflows. This is “lake as garbage dump” — exactly the anti-pattern Inmon warned about. Mitigation: every dataset in the lake should have a defined consumer; without a consumer, the dataset is dead weight.
Cross-region data sovereignty and compliance. GDPR, CCPA, and similar regulations restrict where personal data can be stored geographically. A multi-region lake must enforce that EU customer data lives in EU regions, US customer data in US regions, etc. This requires per-region storage with explicit data classification — and querying across regions is then constrained by the regulations. Mitigation: data classification at ingest, region-aware partitioning, federated query layers that respect regional boundaries.
10. Comparison With Sibling Architectures
| Architecture | Schema | Storage | Update support | Best for |
|---|---|---|---|---|
| Data Warehouse (Snowflake, Redshift, BigQuery, Vertica) | Schema-on-write | Proprietary columnar | Full ACID | Structured BI, governance-critical |
| Data Lake (raw Parquet on S3) | Schema-on-read | Object storage | Append-only | Heterogeneous, exploratory, ML |
| Lakehouse (Iceberg/Delta/Hudi) | Schema-on-read with evolution | Object storage + table format | ACID via table format | Modern unified |
| Data Mesh Architecture | Domain-defined | Federated | Domain choice | Large org with domain teams |
| Operational database | Schema-on-write | Block storage | Full ACID | Transactional |
The lake-vs-warehouse dichotomy was sharp in 2010–2018; the lakehouse era (2020+) has blurred it substantially. Modern systems often run hybrid: lake for the raw heterogeneous foundation, lakehouse table formats for the curated tables, warehouse for the BI-facing aggregates. The “right” choice is increasingly “all three at different tiers.”
For comparison with the federated alternative, see Data Mesh Architecture §10 — mesh and lake are not mutually exclusive; mesh defines ownership semantics that can be implemented on a lake substrate.
11. Interview Discussion Points
“Lake vs warehouse?” The lake stores raw heterogeneous data with schema-on-read; the warehouse stores curated structured data with schema-on-write. Lake favors flexibility and cheap storage; warehouse favors query performance and governance. Most modern shops run both, often with a lakehouse table format (Iceberg, Delta) bridging them.
“What is schema-on-read?” Data is stored in its source format; schema is interpreted at query time. Cheap to ingest, expensive to query (re-derive schema each time). Contrasts with schema-on-write where ETL imposes the schema before storage.
“How do you avoid the data swamp?” Catalog discipline (every table registered, owned, documented), tiered curation (Bronze/Silver/Gold), automated quality monitoring (Great Expectations, Monte Carlo, dbt tests), retention policies, lineage tracking (OpenLineage, Marquez).
“What does Bronze/Silver/Gold mean?” Bronze: raw landing, untouched. Silver: cleansed and conformed (deduplicated, type-coerced, joined). Gold: business-aggregated (star schemas, pre-aggregated metrics). Each tier higher curation, lower volume, higher quality. The pattern enforces discipline.
“What’s a lakehouse?” A lake with an open table format (Iceberg, Delta, Hudi) layered over the files. Adds ACID transactions, schema evolution, time travel, hidden partitioning. Closes the lake-warehouse gap; allows one substrate to serve both analytical and BI workloads. Armbrust et al. (CIDR 2021) is the canonical paper.
“How does GDPR right-to-be-forgotten work in a lake?” Without a table format: scan all files, find affected rows, rewrite the files. Hours-to-days at petabyte scale. With Iceberg v2 / Delta: row-level delete files + compaction; tractable but still non-trivial. With Iceberg v3 deletion vectors (mid-2025): a single binary vector per data file consolidates deletes, removing the v2 per-row delete-file overhead and substantially reducing read-side merge cost. Compliance is a major motivator for lakehouse adoption. Pre-Iceberg lakes typically responded to deletion requests with batch jobs that ran daily or weekly, accumulating requests and processing them in bulk; with v2 row-level deletes, requests can be handled within hours; v3 deletion vectors push the bar further by making the steady-state query path faster.
“What’s the difference between a data lake and a lakehouse?” A lake is raw object-storage files (Parquet, Avro, JSON) with a metadata catalog tracking what exists. A lakehouse adds an open table format (Iceberg, Delta, Hudi) on top of the files that provides ACID transactions, schema evolution, time-travel queries, and indexing — features that historically distinguished warehouses. The lakehouse is “lake substrate with warehouse semantics” and is the dominant 2024+ direction.
“How is data quality enforced in a lake?” Producer-side schema validation (schema registry with backward-compatibility checks); consumer-side automated checks (Great Expectations, Monte Carlo, dbt tests); SLAs per dataset (freshness, completeness, accuracy); explicit ownership; quality scores in the catalog. None of this is automatic — the lake gives you raw data; quality requires deliberate investment.
“Why does the small-file problem matter?” Streaming ingest produces many tiny Parquet files. Per-file metadata overhead dominates; query latency goes up (one S3 GET per file, latency-bound). Mitigation: periodic compaction, batched ingest with sized output files.
“How do queries achieve good performance on a lake?” Partition pruning (skip files outside the WHERE clause), column projection (read only requested columns from Parquet), predicate pushdown (apply filters before deserializing), Z-ordering (multi-dimensional locality), pre-aggregation into Gold for hot queries.
“Compare to the data mesh.” Data Mesh Architecture is an organizational pattern (federated domain ownership of data products); lake is a technical substrate (centralized object storage). They are orthogonal — you can implement a mesh on top of a lake. Mesh addresses governance and ownership pain; lake addresses storage cost and flexibility pain.
“How do you handle late-arriving data in a lake?” Bronze is partitioned by ingest_date; Silver is partitioned by event_date. When events arrive late (event_date < ingest_date), they land in their event_date Silver partition via the daily ETL — which means re-reading and rewriting that partition. Iceberg/Delta make this efficient via row-level upserts; raw Parquet lakes require partition rewrite. The architecture’s tolerance for late events is one of its strengths: events can arrive arbitrarily late and still be processed correctly.
“How do you balance Bronze retention against cost?” Tiering. Recent partitions (last 30-90 days) on S3 Standard for fast query; older partitions on S3 Standard-IA or Glacier Instant Retrieval (cheaper, slightly slower); ancient partitions (3+ years) on Glacier Deep Archive (very cheap, hours-to-restore). Retention should be set explicitly per dataset, with Bronze retention longer than Silver (Bronze is the source of truth; Silver is recomputable from Bronze).
11.1 Worked example: query plan on a partitioned Parquet lake
Concretely, suppose the lake holds an events table partitioned by (date, source), stored as Parquet on S3 at s3://lake/events/date=2026-05-08/source=web/part-0000.parquet, etc. Schema: event_id, user_id, event_type, country, payload_json, timestamp. The query is SELECT country, COUNT(DISTINCT user_id) FROM events WHERE date='2026-05-08' AND event_type='page_view' GROUP BY country.
Catalog lookup. The query engine asks the catalog for the table’s metadata: schema, partition layout, file list. The catalog returns: 100 partitions for date=2026-05-08 (one per source), each with ~10 Parquet files of ~128 MB each.
Partition pruning. The WHERE clause filters by date='2026-05-08', so only that day’s partitions are read. Other dates are skipped entirely — the engine never opens those files.
Column projection. The query needs only country, user_id, and event_type. The engine reads only those three column chunks from each Parquet file, skipping payload_json (likely the largest column) and the rest. Parquet’s columnar layout makes this efficient: each column is stored in a contiguous run of bytes; reading three columns is three separate sequential reads, not 50 small reads of interleaved row data.
Predicate pushdown. The event_type='page_view' predicate is pushed into Parquet’s row-group statistics. Each row group has min/max stats per column; if the row group’s event_type range doesn’t include ‘page_view’, the row group is skipped without decoding any rows. This is particularly effective if data is sorted by event_type within partitions — entire row groups can be eliminated.
Aggregation. The remaining rows (typically a small fraction of the table) are aggregated in parallel across worker tasks. Distinct count via shuffle + final merge, or via HLL approximation if exact-distinct is not required.
Cost. A 1-PB total table; partition pruning to 1% (one day); column projection to 5% (3 columns out of 60); predicate pushdown to 20% of remaining rows. Final read: ~1 PB × 1% × 5% × 20% = 100 GB scanned. At BigQuery’s 0.50. Without partition pruning, it would scan 1 PB at $5000.
This illustrates why partition design matters enormously: a well-partitioned lake serves analytics queries efficiently; a poorly-partitioned lake produces cost surprises.
12. Pitfalls Worth Repeating in an Interview
- The data swamp is the most-cited failure mode; without governance discipline, lakes degrade quickly.
- Schema-on-read means re-deriving schema on every query — cheap ingest, expensive queries.
- Bronze must not be the only zone; without Silver/Gold curation, consumers re-derive cleaning ad infinitum.
- The small-file problem is real for streaming ingest; budget for compaction.
- Cost surprise from per-byte-scanned billing is common; partition wisely.
- GDPR compliance is hard at petabyte scale without a lakehouse table format.
- Lakehouse formats (Iceberg, Delta, Hudi) are increasingly the default; raw Parquet lakes are 2018-vintage thinking.
12.05 The “schema on read vs schema on write” decision in concrete terms
The lake’s schema-on-read promise is often presented as a categorical advantage over warehouses’ schema-on-write. The reality is a tradeoff that a senior architect should be able to articulate concretely.
Schema-on-write (warehouse). The producer must define the schema before data lands. Schema design is a coordination cost between producer and consumer: nobody can produce until the schema is agreed; consumers depend on the schema being stable. The benefit is that queries are fast (the data is already typed and indexed) and predictable (no missing fields, no unexpected types). The cost is that schema changes require explicit migration: ALTER TABLE statements, ETL pipeline updates, downstream consumer updates. At the limit, schema rigidity becomes a velocity bottleneck — every new feature that touches data requires a schema discussion.
Schema-on-read (lake). The producer dumps data in whatever format the source emits; consumers parse and interpret on each query. The benefit is ingest velocity: a new event source can land in Bronze tomorrow without any upstream coordination. The cost is query overhead: every query re-derives types, handles missing fields, handles type variants. At scale, this overhead is real — a query against a heavily-typed Snowflake table can be 10x faster than the same logic against a JSON-blob Bronze table.
The pragmatic middle. Modern systems run schema-on-read at Bronze (ingest velocity) and schema-on-write at Silver/Gold (query performance). The Bronze → Silver transformation is where the schema is enforced. This balances velocity and performance — producers can move quickly, consumers get fast queries, and the transformation logic is centralized in the ETL pipeline rather than spread across consumer code.
The interview-relevant point: “lake = schema on read” is too simple. Real lake architectures use schema-on-read for raw landing and schema-on-write for cleansed/curated tiers, with the medallion architecture’s ETL pipelines enforcing the transition.
12.1 Quick mental model
Lake summary in one sentence: “Store raw heterogeneous data in cheap object storage with schema-on-read; tier curation as Bronze (raw) → Silver (cleansed) → Gold (business-aggregated); lean on a strong metadata catalog to prevent the swamp.” The architecture’s core promise and its main discipline.
A second sentence on the modern direction: “Modern lakes are increasingly lakehouses — open table formats (Iceberg, Delta, Hudi) layered over object-storage Parquet files add ACID, schema evolution, and time travel, closing the lake-warehouse gap and enabling one substrate to serve both analytical and BI workloads.” The 2024+ direction.
The lakehouse paper (Armbrust et al. CIDR 2021) frames this evolution as inevitable — the lake’s economics (cheap storage, decoupled compute) and the warehouse’s semantics (ACID, schema, indexing) are independently desirable, and there’s no fundamental reason they should be mutually exclusive. The table-format layer is the technical artifact that combines them, and adoption has accelerated rapidly because the value proposition is unambiguous: lakes get warehouse semantics, warehouses get lake economics, the lake-vs-warehouse choice dissolves into “lakehouse plus your choice of compute engine.”
A third sentence on the failure mode: “The data swamp is the architecture’s failure state — without governance, ownership, and quality monitoring, the lake degrades into an undocumented dump within months; this is what the Bronze/Silver/Gold tiering and federated computational governance are meant to prevent.” The cautionary point.
12.15 The “data swamp” failure mode in concrete detail
Daniel Smith’s 2014 piece “Data Lakes Become Data Swamps” — and many subsequent essays — warned that lakes without governance discipline degrade into undocumented file dumps. The “swamp” framing has become canonical because the failure mode is genuinely common; understanding what causes it is essential.
The mechanism. A team starts a lake with good intentions. They land Bronze data with the Avro/Parquet conventions everyone agreed to. After 6 months, a new team joins and lands their data with slightly different conventions (Snake_Case vs camelCase column names, different partition keys, different schema-evolution discipline). Nobody owns “the lake” overall — the platform team operates the substrate but doesn’t own dataset content; the producing teams own their content but don’t enforce conventions across each other. After 18 months, ownership has fragmented across dozens of teams; each team’s data has its own conventions; the catalog is partially populated; some datasets have schemas in the registry, others don’t; some have documentation, most don’t. Consumers can’t find what they need; when they do find something, they can’t tell if it’s authoritative or stale; they fork the data into private staging copies. The forking accelerates the divergence — now there are 5 versions of “user_events” with slightly different cleaning logic, none of which has a clear owner.
The symptoms.
- Multiple datasets with similar names (
user_events,user_events_v2,user_events_canonical) and unclear authority. - Documentation that points to the wrong dataset.
- Schemas that drift across producers without coordination.
- Retention policies that vary inconsistently — some datasets retained forever, others deleted unpredictably.
- Quality monitoring that exists for some datasets but not others.
- Consumers maintain private staging copies because they don’t trust the official version.
- The catalog contains 2000 entries; analysts can identify maybe 50 of them as authoritative.
The remediation cost. Once a lake has degraded into a swamp, recovery is expensive: catalog cleanup (audit every dataset, identify owners, document, deprecate redundant copies); data quality remediation (define quality standards, implement automated checks, fix or delete failing datasets); ownership migration (assign every dataset an owner); convention standardization (force a single canonical naming/partitioning/schema convention). These take quarters to years; the disruption to consumers is substantial.
The prevention. A working catalog from day one (Apache Atlas, DataHub, OpenMetadata, AWS Glue, Databricks Unity Catalog), mandatory ownership metadata, automated quality checks (Great Expectations, Monte Carlo, dbt tests), explicit retention policies, schema registry with backward-compatibility enforcement, and regular catalog audits. None of this is optional; without it, swamp formation is essentially inevitable past ~50 datasets and ~10 teams.
The interview-relevant point: the lake’s biggest risk is not architectural — the architecture is sound — it is governance. Ten engineering hours invested in the catalog and discipline are worth more than a hundred hours invested in compute optimization. A candidate who articulates this priority demonstrates the operational maturity that interviews probe for.
12.2 The convergence: lake, warehouse, lakehouse
The lake-vs-warehouse dichotomy was sharp in 2010-2018 and has gradually dissolved through 2020-2026. The convergence is bidirectional:
Warehouses growing toward lakes. Snowflake added external tables (compute over S3 files), then native Iceberg/Delta support. BigQuery added external tables, then BigLake. Redshift added Spectrum (compute over S3). The traditional warehouse boundary — “all data must live in proprietary internal storage” — has eroded; modern warehouses can compute over open-format files in the lake.
Lakes growing toward warehouses. Open table formats (Iceberg, Delta, Hudi) added ACID, schema evolution, time travel, hidden partitioning — features that previously distinguished warehouses. The traditional lake boundary — “no transactions, no schema enforcement, no consistency guarantees” — has eroded; modern lakehouses provide these.
The endpoint. A 2026 modern data platform looks like: object storage as the substrate (S3/GCS/ABS); open table formats over the files (Iceberg dominant, Delta common, Hudi for upsert-heavy workloads); a metadata catalog (Glue, Unity, REST Iceberg catalog); compute engines free to choose (Snowflake, BigQuery, Spark, Trino, Athena, Databricks SQL — all able to query the same files via the table-format spec). The lake-vs-warehouse distinction is replaced by “lakehouse with open table format” plus your choice of compute.
This convergence has substantial implications for hiring, vendor choice, and architectural decisions: vendor lock-in is shrinking (open formats portability), engine choice is decoupling from storage choice, and the “should we use a lake or a warehouse” question is increasingly malformed — the right answer is usually “both, layered as a lakehouse.”
The implication for interviews: a candidate who describes the data architecture as “lake + warehouse” reveals a 2018-vintage mental model. A candidate who describes it as “lakehouse with explicit medallion tiering and an Iceberg catalog, served by multiple compute engines depending on the workload” reveals a 2024+ mental model. The latter framing is more accurate to current architectural practice and signals stronger architectural literacy.
12.3 The honest summary in three sentences
One-sentence summary: “The lake is cheap raw-data storage in cloud object stores, with schema-on-read flexibility, organized into Bronze/Silver/Gold tiers and governed by a metadata catalog — and the lakehouse evolution adds ACID transactions and schema evolution via open table formats (Iceberg, Delta, Hudi) over the same files.”
One-sentence summary on tradeoffs: “Lakes win on storage cost and ingest flexibility; warehouses win on query performance and governance; lakehouses converge the two by adding warehouse-grade table semantics over lake-grade storage, and are increasingly the dominant pattern for analytics in 2024+.”
One-sentence summary on failure modes: “The lake’s defining failure is the swamp — without a working catalog, mandatory ownership, automated quality checks, and explicit retention policies, lakes degrade within months into undocumented dumps that consumers cannot trust.”
13. See Also
- Data Mesh Architecture — federated alternative; orthogonal organizational pattern
- Polyglot Persistence — sibling pattern; lakes are typically polyglot at the curation tiers
- Lambda Architecture — batch layer often built on a lake substrate
- Kappa Architecture — streaming alternative; can write into a lake for archival
- Real Time Analytics System Design — sibling system; OLAP analytics often layered over a lake
- Distributed Log System Design — Kafka, the typical streaming feeder into a lake
- Google File System Design — the GFS / HDFS ancestor of lake storage
- Amazon S3 Object Storage System Design — the modern object-store substrate
- Distributed Key Value Store System Design — sibling storage primitive
- Distributed SQL Database System Design — alternative for structured workloads
- Feature Store System Design — ML serving layer often fed by lake
- Distributed Search System Design — sibling for text-search workloads
- LSM Tree — storage primitive for the operational databases that feed the lake
- B+ Tree — alternative storage primitive
- Inverted Index — for full-text indexing of lake content
- Event Streaming Architecture — streaming ingest into the lake
- Event Sourcing Pattern — events captured into the lake as the source of truth
- System Architectures MOC
- SWE Interview Preparation MOC