Data Platform Architecture and Technology Selection Questions
System-level design of an end-to-end data platform: component selection, build-vs-buy, tool trade-offs, and aligning platform architecture with organizational and analytics needs. Covers reasoning about the whole stack (ingestion through serving) and technology-choice justification. The architect-altitude view above any single pipeline.
List and briefly describe the primary logical components of an end-to-end analytics platform you would propose to a mid-market client: ingestion, raw storage, transformation layer, curated semantic layer, serving/BI layer, orchestration, monitoring, and data catalog. For each component, name a common managed-service or open-source tool you might choose.
Sample Answer
A modern end-to-end analytics platform has roughly eight logical components, and naming a real tool at each layer is what separates a memorized list from a working mental model.
The components
| Component | Job | Common choice |
|---|---|---|
| Ingestion | Get data from source systems into the platform, batch or streaming | Fivetran/Airbyte (batch SaaS connectors), Kafka or Kinesis (streaming) |
| Raw storage | Land data as-is, cheap and durable, before any cleanup | Object storage: S3, Google Cloud Storage, Azure Blob Storage |
| Transformation layer | Clean, join, and reshape raw data into analysis-ready tables | dbt (SQL-based, runs inside the warehouse), or Spark for large-scale/complex logic |
| Curated / semantic layer | Business-friendly tables and metric definitions on top of raw transforms | dbt models plus a metrics layer, or the warehouse's own materialized views |
| Serving / BI layer | Where end users actually query and visualize | The warehouse itself (Snowflake, BigQuery, Redshift) plus a BI tool (Looker, Tableau, Power BI) |
| Orchestration | Sequences and retries the jobs that move data through the layers above | Airflow, Dagster, or a managed equivalent (Cloud Composer) |
| Monitoring / observability | Tells you when a pipeline is late, wrong, or broken | A combination of orchestrator alerting, warehouse query logs, and a dedicated data-observability tool (Monte Carlo, or open-source checks via Great Expectations) |
| Data catalog | Lets people find out what data exists, who owns it, and where it came from | A warehouse-native catalog (Snowflake's Horizon, BigQuery's Data Catalog) or a standalone tool (DataHub, Amundsen) |
Why these eight and not fewer
A platform that skips the raw layer and transforms directly on ingestion loses the ability to replay history when a transform bug is found. A platform that skips the catalog works fine at 20 tables and becomes undiscoverable at 500. The orchestration and monitoring layers are often the two people forget to name first, but they are what make the difference between "a pipeline" and "a platform": without them you have a collection of scripts that happen to run, with no visibility into whether they ran correctly.
Worked example
For a 15-person startup with one data engineer: a Fivetran-style connector or a simple Python script for ingestion, S3 for raw storage, dbt running inside a serverless warehouse (BigQuery on-demand) for transformation and the curated layer, the warehouse plus a light BI tool for serving, a managed orchestrator (Cloud Composer) or even just dbt Cloud's own scheduler if the DAG is simple, warehouse query-history alerts plus a handful of dbt tests for monitoring, and the warehouse's native catalog rather than a standalone tool. Every layer is present, but three of the eight are riding on a single managed product rather than a dedicated tool, which is the correct trade-off at this scale.
Trade-offs and pitfalls
The temptation at small scale is to skip orchestration and monitoring because "the pipeline is simple enough to just run on a cron job." That works until a job silently fails at 3am and nobody notices for a week, which is exactly the failure mode a thin orchestrator plus alerting is built to catch. The opposite failure, at larger scale, is standing up a dedicated best-of-breed tool for every layer before there is a team big enough to operate eight different systems; a platform team of two people cannot realistically run Kafka, Airflow, a standalone catalog, and a standalone observability tool all at once, so consolidating onto the warehouse's native features for two or three of these layers is often the more honest answer than naming eight separate best-of-breed products.
A company with a constrained budget ingests roughly 1 TB/day and expects several hundred concurrent BI users running interactive queries. Compare Snowflake, BigQuery, Redshift, and Databricks for this workload (concurrency, cost predictability and pricing model, performance, admin overhead) and recommend one, explaining what would change your recommendation.
Sample Answer
For a budget-constrained e-commerce company at roughly 1 TB/day with several hundred concurrent BI users, running ETL (extract, transform, load) jobs alongside interactive queries, the decision comes down to how each platform handles concurrency and how predictable its cost is, more than raw query speed, since all four can comfortably handle this data volume.
The four compared
| Snowflake | BigQuery | Redshift | Databricks | |
|---|---|---|---|---|
| Architecture | Multi-cluster, storage/compute/services fully decoupled | Serverless, storage/compute decoupled, no clusters to manage | Cluster-based (or Serverless mode), traditionally tighter storage-compute coupling | Lakehouse-native, Spark-based compute over Delta Lake |
| Concurrency model | Spin up separate virtual warehouses per workload so BI users don't compete with ETL | Auto-scales query slots; concurrency is mostly transparent to the user | Workload management (WLM) queues, or Redshift Serverless auto-scaling | Cluster autoscaling per workload/job |
| Pricing model | Per-second compute billing while a warehouse runs | On-demand (per data scanned) or flat-rate slot commitments | Per-node-hour (provisioned) or per-capacity-unit (serverless) | Per-cluster compute time (DBUs) |
| Best fit here | Predictable cost via warehouse sizing, easy to isolate the 300 BI users from ETL | Simplest ops (nothing to provision), but on-demand cost can spike if queries scan a lot of data without partitioning discipline | Strongest fit if already deep in the AWS ecosystem and wants tight integration | Best if the workload is genuinely mixed BI + ML/Spark, less natural fit for a pure BI-heavy shop |
Recommendation
For a budget-constrained BI-heavy workload at this scale, Snowflake or Redshift Serverless are usually the more predictable choices, because both let you size (or auto-size) compute specifically for the concurrent-BI-user workload without over-provisioning for peak ETL. BigQuery's on-demand model is appealing for its zero-ops story, but at hundreds of concurrent BI users the team needs disciplined partitioning and clustering or the per-query cost becomes hard to forecast; BigQuery's flat-rate slot pricing solves that but requires committing to a capacity level up front, which cuts against "constrained budget." Databricks is the wrong default here unless the same platform is also doing meaningful ML/Spark work, since its per-cluster billing model is optimized for compute-heavy jobs, not hundreds of short interactive BI queries.
What would change the recommendation
If the team is small and wants to spend zero time on capacity planning, BigQuery's serverless model wins despite the cost-predictability risk, because the ops savings often outweigh it at this size. If the company is AWS-committed for compliance or existing infrastructure reasons, Redshift is the practical default even if Snowflake would otherwise edge it out. If the roadmap includes real machine learning workloads within the next year, Databricks becomes worth the switch even though it costs more operational overhead today, because re-platforming later is expensive.
Trade-offs and pitfalls
A common mistake is picking a warehouse based on a benchmark of raw query speed, when at this scale all four are fast enough and the real differentiator is how predictably the cost scales with concurrent users, not with data volume. Another is underestimating the "constrained budget" implication of BigQuery's on-demand model: it looks free until an unindexed table gets scanned by three hundred analysts a day.
Design a governance program meant to meaningfully cut recurring bad-data incidents (say, by half) across dozens of autonomous teams, without centralizing everything and killing team agility. What's your operating model (centralized versus federated, or something closer to how a data-mesh migration would frame domain-level responsibility with central guardrails), what technical controls and organizational changes does it actually require (ownership assignment, runbooks, policy-as-code, quality gates), and what would you measure over the following year to know the program is working, not just running?
Sample Answer
The core design choice is a federated operating model with central guardrails, not full centralization: domain teams own their data and remain accountable for its quality, while a small central governance function owns the shared standards, tooling, and the small set of policies that must be consistent everywhere (naming conventions for canonical entities, classification tiers, the schema-contract format, the escalation path for a cross-domain incident). This mirrors how a data-mesh migration frames domain-level responsibility with central guardrails: the mesh doesn't eliminate governance, it moves enforcement out of a central team's backlog and into each domain's own pipeline, backed by shared infrastructure the central team maintains.
Operating model
- Domain teams: own their source tables, their producer contracts, and first-line triage of quality incidents in their own data.
- Central governance function: owns the policy-as-code framework, the catalog, the classification standard, and cross-domain incident coordination. It sets the bar; it does not review every table.
- Federation boundary: a domain team can ship changes freely as long as they pass the shared automated gates; anything that would break a documented cross-domain contract requires the same CI-enforced compatibility check as any producer contract, not a manual sign-off meeting.
Technical controls and organizational changes
- Ownership assignment. Every dataset with downstream consumers gets a named owning team in the catalog, not a person (people leave, teams persist). This is the single highest-leverage change: an unowned incident cannot be triaged.
- Runbooks. Each owning team maintains a runbook for their domain's common failure modes (a stalled ingestion job, a schema-drift alert, a null-rate spike) so on-call response does not depend on institutional memory. Runbooks are checked into the same repo as the pipeline and reviewed on the same cadence as the code.
- Policy-as-code. Classification rules, retention windows, and compatibility rules are expressed as machine-checkable policy (for example, Open Policy Agent rules or a custom linter run in CI) rather than a wiki page, so a violation fails a build instead of being caught in a quarterly audit.
- Quality gates. Automated checks (freshness, null rate, referential integrity, schema compatibility) run on every load and block publication of a failing batch. This is what actually prevents incidents rather than just detecting them faster.
Concrete rollout: ownership plus runbooks as the first program elements, over 12 months, by vertical
Rather than rolling out to "dozens of teams" simultaneously, sequence by business vertical so the program proves itself before it scales. A realistic first-year plan:
- Months 1-3: pick one vertical, for example the CRM (customer relationship management) domain, as the pilot. Assign explicit ownership for every CRM-sourced table with downstream consumers, write the first runbooks for its two or three most common incident types, and stand up the quality gates on ingestion. This is deliberately narrow so the pattern can be validated before it is asked of teams who did not choose it.
- Months 4-6: extend the same ownership-assignment-plus-runbook pattern to a second vertical with materially different risk profile, for example finance data (where compatibility breaks have compliance consequences, not just dashboard noise). This tests whether the guardrails generalize or were accidentally tuned to CRM's shape of problem.
- Months 7-9: roll the same pattern to the remaining domains in waves of a handful of teams at a time, reusing the policy-as-code rules and runbook templates built in the first two verticals rather than writing new tooling per team.
- Months 10-12: the central function shifts from active rollout to maintenance: quarterly policy review, an incident retrospective process, and a self-service onboarding path so a new team can adopt the standard without a central-team engagement.
What to measure to know it's working, not just running
| Metric | Why it matters |
|---|---|
| Incident count by domain, trended monthly | The stated goal (cut recurring incidents by half); trend, not a single snapshot, filters out noise. |
| Mean time to identify an incident's owning team | Falling toward "the catalog answers this instantly" means ownership metadata is actually current, not decaying. |
| Percentage of in-scope tables with an owner, a contract, and passing quality gates | Coverage; a program with great runbooks on 10% of tables isn't working yet. |
| Runbook usage in incident postmortems | If on-call keeps solving the same incident from scratch, the runbook isn't trusted or isn't current. |
| Domain team velocity (release frequency, lead time) before and after adoption | Confirms the federated model didn't quietly recentralize and become a bottleneck, which was the explicit thing to avoid. |
Trade-offs and pitfalls
The biggest risk in this design is the central function drifting into a review bottleneck by accident: every "just this once" manual sign-off makes the next domain team expect the same, and the whole point of policy-as-code is to make the guardrail a build check, not a meeting. The other common failure is measuring activity instead of outcomes (number of runbooks written, number of tables catalogued) without ever checking whether incident counts actually fell; a program can look busy and still not be reducing the thing it was funded to reduce.
Compare Lambda, Kappa, and a purely-batch architecture for a product analytics platform, such as a fintech workload requiring strict correctness and sub-minute updates. Describe the data flow, operational complexity, and common failure modes of each, and which fits best under different correctness and latency requirements.
Sample Answer
Lambda, Kappa, and pure-batch are three different answers to the same tension: how do you get correct results, quickly, without building the same logic twice.
The three architectures
| Lambda | Kappa | Pure batch | |
|---|---|---|---|
| Data flow | Two parallel paths: a streaming path for fast-but-approximate results, a batch path that recomputes the authoritative result later | One path: everything, including reprocessing, runs through the streaming layer by replaying the event log | One path: everything runs on a schedule against accumulated data |
| Latency | Fast approximate results in seconds, authoritative results after the next batch run | Fast, and correction/reprocessing also happens via the same streaming engine | Minutes to hours behind real time, by design |
| Operational complexity | Highest: two codebases (streaming and batch) computing similar logic, which tend to drift apart | Lower than Lambda, but demands a streaming engine mature enough to handle reprocessing and exactly-once semantics well | Lowest: one scheduled job, standard tooling, well-understood failure modes |
| Common failure mode | The streaming and batch results disagree because the two implementations subtly diverge over time | A bug in the single streaming pipeline affects both real-time and historical results, since there's no independent batch check | Simply too slow for anything needing sub-hour freshness |
Which fits a fintech workload needing strict correctness and sub-minute updates
Kappa is usually the better starting point here, not Lambda, despite Lambda's reputation as the "correctness" architecture. The reason is specific to this requirement: a fintech workload needs strict correctness AND sub-minute freshness, and Lambda's whole premise is that the fast path is allowed to be approximate until the batch path catches up, which is the opposite of what "strict correctness" demands. Kappa avoids maintaining two divergent codebases by making the single streaming pipeline capable of both live processing and full reprocessing (replaying the event log from the beginning when a bug fix or a definition change requires it), which keeps live and historical numbers consistent because they run through identical logic. The trade-off is that Kappa demands real engineering discipline: exactly-once processing guarantees, careful state management, and an event log retained long enough to support full reprocessing.
Pure batch is only viable here if "sub-minute updates" turns out, on closer questioning, to not actually be a hard requirement, since pure batch simply cannot deliver it by construction.
Trade-offs and pitfalls
Lambda's biggest real-world failure mode is exactly what it's often praised for avoiding: the two paths (streaming approximation, batch ground truth) computing the same business logic independently, in two different codebases, with two different engineers maintaining them, and slowly disagreeing on edge cases (how to handle a late-arriving refund, for instance) until nobody trusts either number without manually reconciling. Kappa avoids that specific failure mode by construction but shifts the burden onto the maturity of the streaming engine and the team's comfort with exactly-once semantics; adopting Kappa without that operational maturity in place just relocates the correctness risk rather than removing it.
A data platform's compute and storage costs have grown too high (for example, ETL jobs on transient clusters, or heavy ad-hoc scans of raw files). Propose a cost-optimization plan covering storage tiering (hot/warm/cold), materialized views and caching, compute autoscaling, and any architectural changes, while preserving acceptable query performance.
Sample Answer
When compute and storage costs on a data platform have grown too high, the fix has to separate three distinct cost drivers, wasteful storage tiering, wasteful compute usage patterns, and wasteful query design, because each has a different remedy.
Storage tiering
Move data that is rarely queried (older than, say, 90 days) from hot, expensive storage to a cheaper warm or cold tier, and delete or archive data past its actual retention requirement rather than keeping everything "just in case." This is usually the single largest and least risky lever, because it doesn't touch how anyone queries the data, only where it physically sits.
Materialized views and caching
If ad-hoc queries or dashboards repeatedly recompute the same aggregation from raw data, materializing that aggregation once (refreshed on a schedule matching how fresh the answer actually needs to be) turns many expensive scans into one cheap scan plus many cheap reads of the precomputed result. A result cache in front of the BI layer catches the common case of the exact same query being run many times a day by different dashboard viewers.
Compute autoscaling
For scheduled ETL (extract, transform, load) jobs on transient clusters, right-size the cluster to the actual job (a job that historically finishes with cluster utilization at 30 percent is over-provisioned) and ensure clusters actually shut down between runs rather than idling. For interactive query compute, autoscale down aggressively outside business hours rather than running a fixed-size warehouse around the clock.
Architectural changes
If ad-hoc analysts are scanning raw, unpartitioned files directly, partitioning and clustering the underlying tables on the columns those queries actually filter on (date, region, customer segment) is often the highest-leverage architectural fix, because it reduces bytes scanned per query regardless of who runs it or how often.
Worked example
Say ad-hoc queries against a raw events table currently scan the full table (say, 10 TB) on every query because it isn't partitioned by date, and analysts typically only care about the last 30 days. Partitioning by date so a typical query only scans the relevant 30-day slice (say, roughly 300 GB, if daily volume is even) cuts bytes-scanned-per-query by roughly 97 percent for that common access pattern, which for a byte-scanned pricing model translates almost directly into a proportional cost reduction on that workload, without changing a single line of the analyst-facing query.
Preserving query performance while cutting cost
The order of operations matters: apply storage tiering and partitioning first (these reduce cost without touching latency, and often improve it), then materialize the specific hot aggregations dashboards depend on (this improves latency while cutting cost), and only then look at autoscaling policy (which affects cost directly but needs headroom tuning to avoid introducing cold-start latency during traffic spikes). Cutting compute capacity before fixing the underlying query patterns just makes the same wasteful queries slower without actually reducing waste.
Trade-offs and pitfalls
The most common mistake is reaching for aggressive autoscaling or smaller compute allocations as the first lever, because it's the fastest change to make, without first fixing the partitioning and materialization issues that are the actual source of wasted spend; this trades a cost problem for a latency problem instead of solving either. The second is archiving or deleting data based on age alone without checking whether a specific, infrequently-run but business-critical report (an annual compliance report, say) still depends on it.
Unlock Full Question Bank
Get access to all 16 Data Platform Architecture and Technology Selection interview questions and detailed answers.
Sign in to ContinueJoin thousands of developers preparing for their dream job.