← Expedia Interview Insights

Expedia·Machine Learning Engineer·Onsite - System Design / Architecture·Senior

Senior
Apr 2026

Summary

System design round at Expedia for an ML Engineer role, focused almost entirely on building a large-scale event pipeline end to end. It went deep fast and covered a lot of ground.

Questions Asked (7)

Q1

Design a data pipeline that ingests events from multiple upstream producers, transforms them, and delivers them to analytics-ready storage. Walk through your full architecture.

System DesignTechnical Trade-offsData Modeling
Author's notes

This was the main question and it basically ate the whole session.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints (volume, latency, data sources, analytics needs) before diving into architecture. Then present a layered pipeline: ingestion, processing, storage, and serving, explaining trade-offs at each stage and how they align with ML use cases at Expedia.

Pro tip: Emphasize data quality and schema evolution from the start—interviewers at Expedia value reliability and scalability for travel data, which is seasonal and high-volume. Also, mention how your design supports ML feature engineering and model training, not just analytics.

1. Clarify Requirements and Constraints

Ask about data volume, velocity, variety, latency requirements, and downstream consumers (analytics, ML models). Identify non-functional requirements like fault tolerance, scalability, and cost.

2. Design Ingestion Layer

Choose between batch and stream ingestion based on requirements. Propose using a distributed message queue (e.g., Kafka) to handle multiple producers, with schema registry for data contracts and exactly-once semantics.

3. Design Transformation and Processing Layer

Outline stream processing (e.g., Flink, Spark Streaming) for real-time transformations and batch processing (e.g., Spark) for historical data. Include data cleaning, enrichment, aggregation, and feature computation for ML.

4. Design Storage and Serving Layer

Propose a data lake (e.g., S3) for raw and processed data, and a data warehouse (e.g., Snowflake, BigQuery) for analytics-ready storage. Consider a feature store for ML features and a serving layer for low-latency access.

5. Address Reliability, Monitoring, and Governance

Discuss fault tolerance, backpressure, data quality checks, lineage, and monitoring. Explain how to handle schema evolution, late data, and reprocessing.

Key Points to Mention

  • Trade-offs between batch and stream processing (latency vs. throughput, complexity vs. cost).
  • Use of a schema registry and Avro/Protobuf for schema evolution and data contracts.
  • Exactly-once semantics and idempotent processing to avoid duplicates.
  • Partitioning and indexing strategies for efficient storage and querying.
  • Integration with ML workflows: feature store, model training pipelines, and online serving.
  • Monitoring and alerting for data quality, pipeline health, and SLA adherence.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you handle schema evolution in a high-throughput streaming pipeline without breaking downstream consumers?

System DesignTechnical Trade-offs
Author's notes

Schema registry came up here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging the tension between schema evolution and downstream stability, then propose a strategy that combines backward/forward compatible schema changes with a schema registry and consumer-driven contracts. Emphasize incremental rollout, monitoring, and fallback mechanisms to prevent breakage in high-throughput ML pipelines.

Pro tip: Highlight the importance of treating schemas as APIs with versioning and deprecation policies, and mention that in ML pipelines, feature stores often act as a buffer to decouple producers and consumers, allowing safe schema evolution.

1. Assess current schema and consumer dependencies

Identify all downstream consumers (models, dashboards, etc.) and their schema expectations. Document which fields are critical and how they are used.

2. Adopt a schema registry and compatibility rules

Use a schema registry (e.g., Confluent Schema Registry) to enforce compatibility levels (backward, forward, full) and automate validation of schema changes.

3. Design for backward and forward compatibility

Prefer additive changes (new optional fields) and avoid breaking changes like renaming or removing fields. Use default values and versioned schemas to support mixed-version consumers.

4. Implement gradual rollout and monitoring

Deploy schema changes incrementally, monitor consumer health and data quality metrics, and be ready to roll back if issues arise.

5. Establish governance and communication

Define a schema evolution policy, communicate changes to stakeholders, and provide migration guides for consumers to adapt over time.

Key Points to Mention

  • Schema registry and compatibility modes (backward, forward, full)
  • Additive changes vs. breaking changes (e.g., adding optional fields vs. removing fields)
  • Versioning strategies (e.g., semantic versioning, schema IDs)
  • Consumer-driven contracts and testing (e.g., contract tests)
  • Monitoring and alerting for schema violations and data quality
  • Decoupling via feature stores or intermediate layers in ML pipelines

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

Walk me through the tradeoffs between stream processing (e.g. Flink) and micro-batch approaches (e.g. Spark Streaming) for this kind of pipeline.

Technical Trade-offsSystem Design
Author's notes

Pretty comfortable here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the pipeline's requirements (latency, throughput, consistency, cost) and then compare stream processing and micro-batch on those dimensions. Use a concrete example from Expedia's domain (e.g., real-time pricing or fraud detection) to ground the tradeoffs and show how you'd choose based on business needs.

Pro tip: Acknowledge that many 'real-time' ML use cases can tolerate a few seconds of latency, making micro-batch a simpler and more cost-effective choice; reserve true stream processing for when sub-second latency or complex event-time logic is essential.

1. Clarify requirements

Ask about latency SLAs, data volume, consistency needs, and operational constraints to frame the comparison.

2. Define the approaches

Briefly explain stream processing (event-at-a-time, low latency) vs. micro-batch (small batches, higher latency but simpler).

3. Compare on key dimensions

Discuss latency, throughput, fault tolerance, state management, and exactly-once semantics for each approach.

4. Relate to ML pipeline needs

Map tradeoffs to ML-specific concerns like feature freshness, model retraining frequency, and online inference.

5. Recommend and justify

Propose a choice based on the clarified requirements, and mention hybrid or lambda architectures if appropriate.

Key Points to Mention

  • Latency: stream processing offers millisecond latency; micro-batch typically has seconds to minutes.
  • Throughput and cost: micro-batch can be more cost-efficient for high-volume, less latency-sensitive workloads.
  • Fault tolerance and exactly-once semantics: Flink provides native exactly-once; Spark Streaming offers exactly-once via checkpointing but with higher latency.
  • State management and event-time processing: Flink has advanced windowing and state handling; Spark's structured streaming is improving but less mature.
  • Operational complexity: Flink requires dedicated cluster management; Spark benefits from unified batch/streaming API and existing ecosystem.
  • ML use case fit: micro-batch often sufficient for near-real-time feature updates; true streaming needed for online learning or instant fraud detection.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

How would you design for backfills when your pipeline has already been running in production for months?

System DesignData Modeling
Author's notes

Blanked for a second on this one.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by acknowledging the complexity of backfilling a live production pipeline, then outline a strategy that prioritizes data consistency and minimal disruption. Emphasize idempotency, versioning, and a phased rollout with thorough validation.

Pro tip: Design backfills as first-class citizens from day one by making pipelines idempotent and versioned, so future backfills are just a matter of replaying with a new version. This shows foresight and reduces operational risk.

1. Assess Impact and Requirements

Identify which data needs backfilling, the time range, and the impact on downstream consumers. Determine if the backfill can be done in-place or requires a separate pipeline.

2. Design for Idempotency and Versioning

Ensure the pipeline is idempotent so re-running produces the same results. Use versioned datasets or tables to isolate backfill data from production data.

3. Implement Isolation and Parallelism

Run the backfill in a separate environment or with resource isolation to avoid impacting production. Use parallel processing to speed up the backfill while monitoring resource usage.

4. Validate and Reconcile

Compare backfilled data against expected results or a golden dataset. Check for consistency, completeness, and correctness before promoting to production.

5. Rollout and Monitor

Gradually switch over to the backfilled data, monitoring for anomalies. Have a rollback plan in case of issues.

Key Points to Mention

  • Idempotency: ensuring repeated runs don't duplicate or corrupt data
  • Versioning: using versioned tables or datasets to separate backfill from production
  • Data consistency: maintaining ACID properties or eventual consistency as appropriate
  • Resource isolation: avoiding contention with production workloads
  • Validation: comparing backfilled data with expected outputs or golden datasets
  • Rollback strategy: ability to revert to previous state if backfill fails

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

How do you ensure data quality and handle bad or malformed events at scale?

System DesignProduct Analytics & Metrics
Author's notes

Went with a layered approach: validation at ingestion, quarantine to a dead-letter queue, alerting on error rates.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing data quality as a multi-layered pipeline concern: validation at ingestion, monitoring in flight, and remediation post-hoc. Then walk through a concrete architecture that handles malformed events gracefully at scale, emphasizing trade-offs between strictness and availability. Finally, tie it back to ML-specific needs like feature freshness and training-serving consistency.

Pro tip: Show you understand that not all bad data is equal—distinguish between recoverable (e.g., schema drift) and unrecoverable (e.g., corrupt payloads) errors, and design your system to quarantine rather than drop, enabling later reprocessing. This demonstrates production maturity and cost-awareness.

1. Define data contracts and validation rules

Establish explicit schemas, SLAs, and quality dimensions (completeness, accuracy, timeliness) for each event stream. Use schema registry and enforce validation at the edge (e.g., producers) and at ingestion.

2. Implement tiered validation and quarantine

Apply lightweight syntactic checks (JSON parse, required fields) first, then semantic checks (range, referential integrity). Route failures to a dead-letter queue or quarantine store with metadata for debugging and reprocessing.

3. Monitor and alert on quality metrics

Track metrics like validation failure rate, schema drift, and latency; set up automated alerts and dashboards. Use statistical process control to detect anomalies in event distributions.

4. Automate remediation and reprocessing

Build tooling to fix common issues (e.g., schema evolution, default values) and replay quarantined events after correction. Ensure idempotency and exactly-once semantics where needed.

5. Close the loop with ML-specific quality checks

Validate feature distributions, detect training-serving skew, and monitor model performance degradation due to data quality. Feed insights back to upstream producers.

Key Points to Mention

  • Schema registry and evolution (e.g., Avro, Protobuf) to handle backward/forward compatibility
  • Dead-letter queues and quarantine patterns for malformed events
  • Data quality dimensions: completeness, accuracy, consistency, timeliness, validity
  • Monitoring and alerting with tools like Prometheus, Grafana, or custom dashboards
  • Idempotent processing and exactly-once semantics for reprocessing
  • ML-specific concerns: feature freshness, training-serving skew, and data drift detection

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q6

How would you approach observability and lineage for a pipeline like this, and what does a meaningful SLA look like?

System DesignProduct Analytics & Metrics
Author's notes

Talked about end-to-end latency tracking, data freshness metrics, and column-level lineage for debugging.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the pipeline's components and business context, then outline a layered observability strategy covering data, model, and system health. Define SLAs that are meaningful to stakeholders by linking them to user experience and business metrics, and explain how lineage enables root cause analysis and trust.

Pro tip: Tie SLAs to business outcomes (e.g., booking conversion impact) rather than just technical metrics, and mention that you'd implement automated lineage tracking to reduce manual debugging overhead.

1. Clarify Pipeline and Requirements

Ask questions to understand the pipeline's data sources, processing steps, model deployment, and business goals. Identify key stakeholders and their expectations for reliability and performance.

2. Design Observability Layers

Propose monitoring at three levels: data quality (freshness, schema, drift), model performance (accuracy, latency, bias), and system health (resource usage, errors). Suggest tools like Prometheus, Grafana, and custom dashboards.

3. Implement Lineage Tracking

Describe how to capture lineage from data ingestion to model predictions, using metadata stores (e.g., MLflow, Amundsen) and logging. Explain how lineage aids debugging, impact analysis, and compliance.

4. Define Meaningful SLAs

Define SLAs that align with business impact, such as prediction latency <100ms for 95% of requests, model accuracy within 2% of baseline, and data freshness <1 hour. Include error budgets and escalation paths.

5. Establish Feedback and Iteration

Explain how you'd use observability data to continuously improve the pipeline, set up alerts, and conduct post-mortems. Emphasize collaboration with product and engineering teams to refine SLAs.

Key Points to Mention

  • Data drift detection and automated retraining triggers
  • Model performance monitoring in production (e.g., A/B tests, shadow deployment)
  • End-to-end lineage from raw data to predictions for root cause analysis
  • SLA examples: latency, accuracy, freshness, and availability targets
  • Integration with existing monitoring tools (e.g., Datadog, New Relic)
  • Business impact mapping: how SLA breaches affect user experience and revenue

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q7

What's your strategy for managing cost and scaling as event volume grows by an order of magnitude?

Technical Trade-offsSystem Design
Author's notes

Short discussion at the end.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the current scale and cost drivers, then propose a multi-layered strategy that includes architectural changes, algorithmic optimizations, and cost monitoring. Emphasize trade-offs between cost, latency, and accuracy, and how you would prioritize based on business impact.

Pro tip: Quantify the impact: estimate the cost per event or per prediction at current scale, then project the savings from each optimization. This shows you think in terms of ROI and can justify engineering investments.

1. Clarify assumptions and current baseline

Ask about current event volume, cost breakdown (compute, storage, network), and SLAs. Establish a baseline to measure improvements.

2. Identify cost drivers and bottlenecks

Analyze where costs scale linearly or worse with volume. Common drivers: model inference, data processing, storage, and I/O.

3. Propose architectural and algorithmic optimizations

Suggest techniques like model quantization, caching, batch processing, serverless, and distributed systems. Prioritize based on impact and effort.

4. Implement monitoring and auto-scaling

Set up cost and performance monitoring, and use auto-scaling to match resources to demand. Consider spot instances and reserved capacity for cost savings.

5. Iterate and validate trade-offs

Continuously measure cost per event and model performance. Be prepared to trade off accuracy for cost if business allows, and validate with A/B tests.

Key Points to Mention

  • Model optimization techniques: quantization, pruning, distillation, and using smaller models for less critical tasks.
  • Caching and precomputation: cache frequent predictions, precompute embeddings, and use CDNs for static data.
  • Batch and stream processing: use batch for non-real-time, and efficient stream processing (e.g., Kafka, Flink) for real-time.
  • Infrastructure choices: serverless for spiky workloads, spot instances for fault-tolerant jobs, and auto-scaling groups.
  • Cost monitoring and attribution: use tools like AWS Cost Explorer, custom dashboards, and tag resources to track spending per service.
  • Trade-offs: balance latency, accuracy, and cost; consider tiered serving (e.g., cheap model for most, expensive for high-value users).

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.