Chapter 21 · Big Data

MapReduce and Large-Scale Batch Processing


MapReduce is both a programming model and a canonical lesson in distributed batch execution: split input, map records, partition and shuffle intermediate keys, sort/group values, reduce results, and retry failed tasks. Modern engines often expose richer DAGs and in-memory execution, but interviews still use MapReduce to test partitioning, data locality, shuffle cost, skew, joins, fault tolerance, deterministic replay, and when batch is preferable to streaming or a database query.

Level: foundation → senior/staff Primary skill: turning large datasets into fault-tolerant partitioned batch computations Companions: Object Storage · Message Queues · Replication and Sharding · Computer Architecture

How to use this chapter

  1. Read the mental model and mechanics without taking notes.
  2. Close the page and explain the topic aloud in five minutes.
  3. Work the quantitative example on paper.
  4. Answer the question ladder without revealing the answer signals.
  5. Complete one design drill and score yourself with the senior checklist.

Learning objectives

  • Explain map, partition, shuffle, sort/group, reduce, and output commit precisely.
  • Design key/value representations and combiners that preserve correctness.
  • Estimate scan, shuffle, network, disk, memory, and task-overhead costs.
  • Handle worker failure, retries, speculative execution, stragglers, skew, and bad records.
  • Implement aggregation, joins, top-K, secondary sort, deduplication, and inverted indexes.
  • Compare classic MapReduce with SQL warehouses, DAG engines, stream processing, and incremental systems.

Mental model

Treat a batch job as a deterministic transformation over immutable input partitions. Map produces zero or more intermediate (key, value) pairs. A partitioner routes all values for a logical key to the same reducer. The framework shuffles and groups them, then reduce computes output for each key. The system persists enough input/intermediate state and task metadata to rerun work after failure.

Core mechanics

Execution pipeline

Input files are divided into logical splits. Map workers read splits—ideally near their storage—parse records, run the mapper, buffer intermediate pairs, partition by reducer, spill/sort to local storage, and expose segments. Reducers fetch their partition from every mapper, merge/sort by key, invoke reduce, and write final output. A coordinator tracks task state and retries failures.

The number of input splits affects parallelism and overhead; it need not equal source file count. The number of reducers controls output partitioning and maximum reduce parallelism. A map-only job is valid when no grouping is needed. Each output task should commit through a temporary path/attempt identifier so speculative or retried attempts do not publish duplicates.

Key design and partitioning

The intermediate key defines both grouping semantics and data movement. For word count it is the word; for per-user totals it is user ID; for a join it often includes join key plus source tag. The partitioner should distribute total bytes and CPU, not merely key count. Hash partitioning spreads ordinary keys; range partitioning creates ordered output but needs sampled boundaries and skew control.

Composite keys support secondary sort: partition/group by a prefix while sorting by additional fields such as timestamp. A custom grouping comparator can make the reducer see all records for one entity in desired order. Misaligned partition/group logic causes missing or split groups and is a correctness bug, not just performance.

Combiners and aggregation algebra

A combiner performs local partial aggregation before shuffle. The framework may call it zero, one, or multiple times, so it must preserve semantics under arbitrary grouping. Associative and commutative operations such as sum, min, max, and count are natural. Average is not safely combined as an average of averages; emit (sum, count) and merge those. Median and exact distinct require richer state or different algorithms.

In-mapper combining can reduce allocations and shuffle further but increases mapper memory and complexity. Bound maps and flush partials to avoid OOM. Numerical stability, overflow, and floating-point non-associativity can make results differ by partition/order; define tolerances and types.

Shuffle, sort, and spill

Mapper output is buffered until thresholds trigger spill files, then merged. Reducers fetch many mapper segments over the network and merge them, sometimes spilling repeatedly. Compression lowers network/disk at CPU cost. Serialization format, key width, partition count, and small records strongly affect overhead.

Tune for fewer passes and adequate parallelism, but avoid giant buffers that trigger memory pressure. Map-side filtering and projection, local aggregation, bloom filters, and partition-aware joins reduce shuffle. Observe map-output bytes versus input/output bytes; a high ratio is an architectural signal.

Fault tolerance and deterministic retry

Failed map tasks can reread immutable input. If map intermediates live on local worker disk and that worker dies, completed map tasks may need rerun for reducers. Failed reducers refetch map output. The coordinator treats attempts as replaceable and accepts one committed output. Distributed storage protects final input/output separately.

User functions should be deterministic or at least idempotent with respect to attempt. Calling an external API, sending email, or mutating a database from a mapper creates duplicate/unbounded side effects. Capture reference data as versioned input and write outputs to a commit protocol, then publish downstream after job success.

Stragglers and speculative execution

A job completes at the speed of its slowest required tasks. Stragglers arise from bad hardware, noisy neighbors, skewed splits/keys, GC, remote reads, retries, or pathological records. Speculative execution launches another attempt for unusually slow tasks and commits the winner, helping random slowness but doubling work. It does not fix deterministic skew: both attempts receive the same huge key.

Use progress rate and comparable task cohorts rather than elapsed time alone. Diagnose input bytes, output bytes, records, CPU, spill, fetch, and host health. Split oversized files, salt heavy keys, or isolate malformed data.

Skew and heavy hitters

One key with billions of values forces one reducer to process them, even with thousands of reducers. Detect heavy hitters via samples, sketches, or prior statistics. For associative aggregation, add a random salt to the heavy key in a first stage, partially reduce across many reducers, then merge in a second stage. For joins, broadcast the small side or shard the large-key join carefully.

Range boundaries can also skew when sampled data misses peaks or time distribution shifts. Report max/median task bytes and duration; averages hide the reducer that determines completion. Dynamic work stealing is harder after shuffle because ownership must preserve key grouping.

Join patterns

A reduce-side join maps both datasets by join key with a source tag, shuffles both, then combines at reducers. It is general but expensive. A map-side/broadcast join distributes a small relation to every mapper and streams the large relation locally, avoiding large-side shuffle. A partitioned map-side join works when both inputs share compatible partitioning and sorting.

Handle duplicate multiplicity: a key with m rows on one side and n on the other produces m × n output for an inner join. This can explode unexpectedly. For skewed keys, isolate or preaggregate. Define outer-join missing-side behavior and memory strategy when one group is too large to buffer.

Canonical algorithms

Word/count aggregation: map (key, 1), combine sums, reduce sum. Inverted index: map term to document/position, group and compress postings. Deduplication: key by canonical record ID/fingerprint, reduce according to deterministic winner; be cautious about hash collisions. Top-K: compute bounded local heaps, then merge candidates globally or by partition. Matrix/graph computations: often require multiple stages and may be inefficient in classic disk-heavy MapReduce.

Approximate sketches—HyperLogLog, count-min sketch, quantile summaries—can make intermediate state mergeable and bounded. State error bounds and merge properties rather than claiming exactness.

Workflow DAGs and incremental publication

Real pipelines chain jobs: extract, normalize, join, aggregate, validate, publish. Orchestration needs immutable run IDs, input snapshots, retries, lineage, checkpoints, schema contracts, data-quality gates, and atomic publication. Writing a _SUCCESS marker alone is only useful if readers use it consistently and partial files are isolated.

Backfills should not overwrite newer partitions blindly. Partition outputs by event date plus run/version, validate counts/checksums, then update a manifest/catalog pointer. Retain previous versions for rollback and garbage-collect only after dependent readers advance.

When not to use MapReduce

Interactive SQL is better served by a warehouse/query engine; iterative machine learning and graph algorithms benefit from in-memory DAG engines; low-latency continuous updates need stream processing; transactional point updates need a database. MapReduce remains strong for huge immutable batch scans, simple retry, cheap commodity/object storage, and workloads whose latency budget is minutes or hours.

Modern systems may disaggregate compute and object storage, weakening classic node-locality assumptions but preserving data locality at region/zone/cache level. The core reasoning—partition, minimize movement, handle skew/retry, publish atomically—still applies.

Decision table

DecisionPrefer the first option when…Prefer the second option when…Senior caveat
MapReduce vs warehouse SQLCustom parsing/algorithms and explicit control over huge batch transforms matter.Declarative relational analysis, optimizer, and interactive productivity dominate.Many warehouses compile queries into distributed stages; explain workload, not branding.
Reduce-side vs broadcast joinBoth inputs are large or the small side cannot fit/distribute safely.One side is bounded and can be sent to every mapper/executor.Broadcast cost equals small-side size times workers and can still overwhelm memory/network.
Exact vs approximate aggregationCorrectness/legal use requires exact results and cost is acceptable.Cardinality/quantile/top-frequency estimates with known error are enough.Choose mergeable sketches and state error/confidence plus adversarial/skew behavior.
More reducers vs fewerShuffle/output is large and parallelism dominates.Per-task overhead/small files and global merge dominate.Reducer count also fixes output partitions; plan downstream file size and skew.
Speculation vs no speculationTasks are deterministic/idempotent and random stragglers dominate.Tasks have side effects, scarce resources, or deterministic skew.Use progress-aware thresholds and cap extra capacity.
Batch vs streamComplete snapshots, complex joins, reprocessing, and high latency tolerance dominate.Continuous low-latency results and event-time updates dominate.A common architecture uses streaming for freshness and batch for correction/backfill.

Quantitative reasoning

Failure modes and production signals

Failure modeWhat users seeLikely causeMitigation / design responseUseful signals
Reducer skewMost tasks finish; one runs for hoursHeavy key or bad range boundarySample/detect heavy hitters, salt/two-stage aggregate, custom partitionMax/median bytes and duration, top keys
Shuffle fetch failureReducers repeatedly restart or stallMapper loss, network/disk pressure, expired intermediatesRetry/recompute maps, reserve local disk/network, cap fan-outFetch errors, mapper reruns, local disk, network
Excessive spillHigh disk I/O and slow maps/reducesBuffers too small, wide records, poor combinerProject/combine/compress, tune bounded memory, reduce key widthSpill count/bytes, merge passes, GC
Small-file explosionScheduler/metadata bottleneck and slow downstream readsToo many input/output partitionsCompact, target file size, adaptive partitioning, manifestFiles/task, open latency, metadata QPS
Non-deterministic retryDuplicate or inconsistent outputExternal side effects/randomness/time-dependent lookupImmutable versioned inputs, pure functions, attempt-safe output commitAttempt differences, duplicate effects, checksum mismatch
Bad-record crash loopSame task fails every retryMalformed or adversarial recordBound parse resources, quarantine with sample/count, policy thresholdFailure offset/key, retry identity, bad-record rate
Speculation overloadCluster work rises without job finishing fasterDeterministic skew or aggressive thresholdDisable/cap, diagnose skew, compare progress-normalized cohortsSpeculative attempts, wasted CPU/I/O, winner rate
Partial publicationReaders see incomplete datasetTasks write visible final paths before job commitAttempt temp paths, manifest/atomic pointer, success validationMissing partitions, duplicate files, run/version mismatch

Senior-level lenses

Shuffle bytes are the architecture bill

Begin with bytes at every stage: input read, map output, post-combine, network shuffle, spill, final output. Most major optimizations reduce data early, colocate it, or change the algorithm. CPU tuning matters after movement is understood.

Associativity is a scalability superpower

Operations that can be merged in any grouping permit combiners, tree aggregation, incremental recompute, and parallel recovery. Represent averages as sum/count, variance with mergeable statistics, and top-K as bounded candidates. Prove the merge law and identity.

Data skew is a product property

Celebrity users, null/default keys, major countries, and one event day create heavy hitters. Uniform synthetic tests are misleading. Feed sampled production distributions into partition planning and make top-key telemetry privacy-safe but actionable.

Atomic publication separates computation from truth

Tasks can retry and produce attempts; readers should see only a validated run. Publish a manifest/catalog pointer after completeness and quality checks. Keep prior versions for rollback and lineage. This pattern also applies to indexes, models, and configuration bundles.

Recompute is a recovery strategy only with retained inputs

Immutable raw data, versioned reference datasets, deterministic code/container, and lineage make rebuild possible. Calculate replay time and storage retention. A pipeline that needs three weeks to recompute cannot meet a four-hour recovery objective without checkpoints or derived backups.

Choose latency architecture consciously

Batch, micro-batch, and streaming are not maturity levels. Batch offers simple complete-snapshot reasoning and efficient scans; streaming offers freshness with state, watermarks, and continuous operations. Use a combined design when correction and freshness have different needs, but avoid maintaining two divergent business logics unnecessarily.

Interview question ladder

Q21.1 foundation

What are map and reduce?

Show strong-answer signals

Map transforms input records into keyed intermediates; shuffle groups same keys; reduce combines each key’s values into output.

Q21.2 foundation

What is the shuffle?

Show strong-answer signals

Partitioning, transfer, sorting/merging, and grouping of mapper output to reducers; often the dominant network/disk cost.

Q21.3 foundation

When is a combiner safe?

Show strong-answer signals

When its partial output can be merged with the same algebra under arbitrary zero/multiple invocations—typically associative and commutative state.

Q21.4 intermediate

How do you compute average with a combiner?

Show strong-answer signals

Emit/merge (sum, count), then divide after final reduction; do not average partial averages without weights.

Q21.5 intermediate

How do you join a huge table to a small table?

Show strong-answer signals

Broadcast/map-side join if the small side fits each worker; otherwise reduce-side or co-partitioned join, with skew/multiplicity analysis.

Q21.6 intermediate

Why does one reducer take much longer?

Show strong-answer signals

Heavy key/range, larger records, bad host, spill/fetch, malformed input; compare bytes/records/progress and handle deterministic skew separately.

Q21.7 senior

Design daily unique-user counts over trillions of events.

Show strong-answer signals

Partition pruning, dedupe identity/window, exact sort/set versus mergeable HLL with error, combiner, skew, late data, output version, validation/backfill.

Q21.8 senior

Build an inverted index with MapReduce.

Show strong-answer signals

Tokenize map term→doc/positions, local combine, partition by term, sort/compress postings, handle stop/heavy terms, immutable segments/manifest, incremental merge.

Q21.9 senior

A 6-hour job must finish in 90 minutes. Approach?

Show strong-answer signals

Profile stage/bytes/skew, prune/project, combine, broadcast/partition joins, file sizing, parallelism, resource bottleneck, incremental computation, and validate cost/SLO.

Q21.10 senior

Design a safe backfill for a derived table.

Show strong-answer signals

Snapshot inputs/code/schema, run-isolated output, idempotent partitions, data-quality comparison, catch-up delta, manifest cutover, rollback, lineage and cleanup.

Q21.11 staff / stretch

Design a batch platform on object storage.

Show strong-answer signals

Split/file formats, scheduler, shuffle service, retries/speculation, quotas/fairness, catalog/lineage, schemas, secrets, observability, publication, cost and multi-tenancy.

Q21.12 staff / stretch

Choose batch, stream, or incremental view for company metrics.

Show strong-answer signals

Freshness/correction/replay, event time, cost, state size, joins, ownership, one logic path, SLOs, backfills and auditability.

Design drills

Drill 1 Search index build

Build a web-document inverted index from object storage, including tokenization, heavy terms, postings compression, retries, manifests, and incremental refresh.

What the interviewer is testing

Key design, shuffle/skew, immutable publication, and downstream serving.

Drill 2 Revenue reconciliation

Join orders, payments, refunds, and settlement files daily; handle duplicates, late files, currency, data quality, and reruns.

What the interviewer is testing

Batch correctness, joins, versioned inputs, and audit.

Drill 3 Batch-to-stream redesign

A four-hour dashboard job needs five-minute freshness while retaining exact daily correction. Design the migration and shared semantics.

What the interviewer is testing

Choosing complementary streaming and batch paths without inconsistent logic.

Common weak answers and how to improve them

“MapReduce parallelizes a loop.”

Show the stronger answer

Explain keys, partitioning, shuffle, grouping, retries, output commit, and data movement.

“Add more reducers.”

Show the stronger answer

Find byte/CPU/skew/metadata bottlenecks; one heavy key will remain serial.

“Use a combiner for average.”

Show the stronger answer

Use mergeable (sum, count) and prove arbitrary invocation safety.

“Speculative execution fixes stragglers.”

Show the stronger answer

It helps random slowness, not deterministic skew, and consumes extra capacity.

“Write results directly to the final table.”

Show the stronger answer

Use attempt isolation, validation, and atomic manifest/pointer publication for retries and rollback.

Primary sources and standards