Enable Data Engineers to understand, build, debug, and design distributed processing systems—not merely reproduce Spark, Kafka, or Flink API examples. Prioritize transferable understanding and correctness under failure over preserving older article structure.
Status shows the state of the project today; everything else on this page is the curriculum plan v2.0.
·
How a module works
1. Conceptual FoundationsMechanisms, visual models, worked examples, prediction questionsLearner predicts system behavior and explains whyAuto-graded prediction set; recorded for routing, not gating on its own
2. Guided ImplementationRunnable code, deterministic fixtures, execution evidenceLearner constructs correct behavior and checks invariantsAuto-graded against the lab's result oracle
3. Engineering ProblemsUnfamiliar failures, observations, logs, metrics, broken codeLearner diagnoses, repairs, and adds a regression testHidden tests on the repaired code, plus a learner-written regression test that must fail on the original defect — gating
4. Architectural JudgmentMore than one defensible solution; explicit constraintsLearner compares guarantees, network/memory/cost, operational complexity, and tradeoffsFixed decision-record format, automated structural pre-check, then assessor scoring against the published rubric — gating (§8)
A module is passed on evidence, not attendance: Stage 3 hidden tests and the Stage 4 rubric define a module pass (§8); track gates certify tracks. Required edges are satisfied at module granularity.
liveon this siteauthoredwritten and verified; gatedplannednot written yet
·
Before you start
Basic Python (functions, lists/dictionaries, tests), SQL joins/grouping, structured file I/O, command-line execution, and basic reasoning about latency vs throughput. Do not require Spark, Kafka, Flink, cloud accounts, Kubernetes, or containers to begin. The first container dependency is S04 on the Spark route and K02 on the Kafka route; F01–F04, S01–S03, K01, and ST01–ST02 run without containers.
F
Distributed Computing Foundations4 core
Build engine-independent mental models using small deterministic Python experiments before introducing Spark.
Foundations (F01–F04) · Python standard library, optional SQLite for sink simulation · No containers/cloud requirement
GATE · G-Fcore · F01–F04Correct partitioned aggregate, explained movement/skew, safe failure recovery with a retry-safety regression test, architecture reasoning
F01 · Parallelism & the Economics of Distributioncorelive
Owns
Latency/throughput, serial fraction, CPU/I/O/network costs, parallel overhead, coordination
Requires
Entry baseline
You can
Predict when additional workers help or hurt and justify using a cost model
DAG dependencies, deterministic work, retries, lost intermediate results, pure vs side-effecting tasks; idempotent/deduplicating sinks under at-least-once retry and the scope-naming rule (primary owner); testing retry-safe computation with fixtures, oracles, and failure injection (primary owner)
Spark Batch (S04–S06) · Containerized Spark standalone cluster (below) · First container dependency on the Spark route; scripted, named failure controls
S01–S03 run in PySpark local mode with the Spark UI. S04–S06 run on the containerized Spark standalone cluster (§7), because locality, executor sizing, dynamic allocation, executor loss, lost shuffle data, speculative attempts, and output-commit behavior cannot be demonstrated with a single in-process executor.
GATE · G-Score · S01–S06Diagnose a Spark plan/runtime failure on the standalone cluster; improve behavior without changing the result; show that a killed worker and a duplicate task attempt leave no partial or duplicated published output
Build explicit reasoning about partition-scoped ordering, replication, producer acknowledgement ambiguity, consumer progress, and replay. K01 teaches the log on a Python simulator so the Kafka route has no container dependency before K02.
Kafka (K02–K04) · Three-broker local Kafka in reproducible containers · First container dependency on the Kafka route; no cloud account as mandatory dependency
GATE · G-Kcore · K01–K04Reason about publish/replay/consumer crash and external sink boundaries
K01 · Partitions, Offsets & Orderingcoreplanned
Owns
Broker/topic/partition/log/offset, keys, per-partition order. Stages 1–3 run on a Python-simulated partitioned, append-only log (per-partition offsets, key hashing, consumer positions); an optional verification lab repeats the predictions on a single real broker
Batching, acks, retries, idempotent producers, leader/replicas/ISR/failover. First container dependency on the Kafka route: a three-broker cluster (replication factor 3, min.insync.replicas=2) so ISR shrink and leader failover are observable
Teach temporal and stateful ideas independent of engines, then apply them in an already-familiar Spark model.
Spark streaming (ST03) · Local sources in local mode first; Kafka-backed variants later; the standalone cluster for the worker-loss-during-query variant · Isolate checkpoint directories per scenario
Explain differing results for arrival-time and event-time windows; explain what happens to latency and buffers when a consumer is slower than its producer
readStream, micro-batches, progress tracking, checkpoints, state stores, sink behavior; state-store partition count fixed by spark.sql.shuffle.partitions at first run and unchangeable without a new checkpoint; testing event-time logic with controlled sources and test oracles
Foundation/Spark routeF01–F04 → S01–S06 (local mode through S03; the standalone cluster from S04). Learners can then join streaming or integration.
Kafka routeF01–F02 → K01 (simulator, no containers) → {K02, K03} → K04. Spark is not mandatory.
Streaming concepts routeF01–F03 → ST01–ST02; add S01–S02 for ST03.
Flink routeF01–F04 + ST01–ST02 → FL01–FL04. The full Spark Batch track is not required.
Integration route (core)K04 + [S03 or FL02] + [ST03 or FL03] → I01 → I02. Spark-only and Flink-only learners both qualify; the engine not used to satisfy the slots is recommended, and the case study supplies a concise conceptual comparison for it.
Platform route (advanced)I02 + [S06 or FL04] → I03.
The order is a partial ordering, not one compulsory 24-item playlist. Diagnostic gaps should drive personalized pathways.
·
Prerequisite map
J · join/shuffle cost: S03 or FL02R · checkpointed stateful streaming: ST03 or FL03FT · engine fault tolerance and operations: S06 or FL04liveauthoredplannedadvanced module
Solid arrows are direct required edges; dotted arrows into a hexagon form an OR-slot: any one of them satisfies the slot.
Module
Required (all of)
OR-slots (one module from each)
F02 / F03 / F04
F01 / F02 / F03
—
S01 … S06
F04 → S01 → S02 → S03 → S04 → S05 → S06 (chain)
—
K01
F02
—
K02, K03
K01
—
K04
K02, K03
—
ST01 / ST02
F03 / ST01
—
ST03
S02, ST02
—
FL01
F04, ST01
—
FL02
FL01, ST02
—
FL03 / FL04
FL02 / FL03
—
I01
K04
J: {S03, FL02}; R: {ST03, FL03}
I02
I01
—
I03
I02
FT: {S06, FL04}
Recommended (non-blocking) background
Target
Recommended preparation
Notes
ST01
K01
Useful event-log context; the K01 simulator needs no runtime
ST03
S03
Shuffle partitions determine state-store partition count; restarts fail if it changes
ST03
K04
Needed for the full Kafka-integrated version, not local-source basics
FL01
ST03
Helps compare execution styles, not essential
FL03
K04
Kafka positions/replay enrich checkpoint examples
FL04
S05
Shared resource/diagnostics intuition
I01
The engine not used for slots J and R (S03 + ST03, or FL02 + FL03)
A better-informed Spark/Flink comparison; a concise comparison is supplied in the case study
I02
FL03; lakehouse transaction concepts
Advanced sink-state and cross-system correctness
I03
The engine not used for slot FT; advanced orchestration/storage concepts
A required edge is satisfied by a module pass, a module diagnostic, or a passed track gate for that module's track (§8). An OR-slot is satisfied when any one listed module is satisfied by any of those means. Recommended edges create a short bridge lesson or reference, never an automatic block. Unknown level ≠ a prerequisite failure; assess first.
Correct partitioned aggregate, explained movement/skew, safe failure recovery with a retry-safety regression test, architecture reasoning
G-S
core
S01–S06
Diagnose a Spark plan/runtime failure on the standalone cluster; improve behavior without changing the result; show that a killed worker and a duplicate task attempt leave no partial or duplicated published output
G-K
core
K01–K04
Reason about publish/replay/consumer crash and external sink boundaries
Recoverable source → engine → sink flow with guarantee scope stated per boundary, failure windows enumerated, replay without incorrect observable duplicates
G-FL
advanced
FL01–FL04
Stateful Flink recovery under checkpoint/backpressure/rescaling stress
G-P
advanced
I03
End-to-end platform architecture with explicit guarantees, failure cases, capacity and backlog recovery, observability, cost, and tradeoffs
Cross-gate quality requirements
Test functional invariants before measuring performance.
Assess unseen inputs/failures, not memorization of the guided example.
Require an observable repair and regression evidence for Stage 3.
Require at least two plausible options and explicit constraints for Stage 4.
Distinguish engine-internal recovery from external sink effects; do not award credit for unqualified "exactly once" claims. The same rule applies to batch output: a green job with partial or duplicated published files is a failure.
Publish transparent rubric criteria; keep hidden test fixtures and full answers separate.
A module must teach, or inherit from a prerequisite, the testing technique its Stage 3 regression test requires.
Outcomes are worded by what the module's reference runtime can show: demonstrate only where demonstrable, otherwise explain.
·
Who this is for
Proficiency
Typical evidence
Example failure/problem
Junior
Explain partitions/tasks/shuffles; implement an accurate simple computation; identify straightforward defects
Missing global combine produces the wrong revenue total
Mid-level
Read Spark plans, handle retries and common skew, implement Kafka consumption and basic stateful queries
Consumer crash duplicates database updates; one Spark task becomes a straggler
Senior
Diagnose ambiguous commits, checkpoint issues, resource bottlenecks, and incorrect outputs under replay or duplicate task attempts
Stateful output diverges after checkpoint recovery despite healthy tasks; a speculative attempt double-writes a batch partition
Backpressure, incomplete sink commits, and a recovery backlog conflict with latency and cost SLOs
Do not require every Junior to complete 19 modules or assume every Staff engineer has mastered all basics. Readineer should recommend the smallest dependency-complete path that resolves diagnosed gaps, choosing the learner's known engine for any OR-slot.
·
Reference stack
Area
Preferred implementation
Setup principle
Foundations (F01–F04)
Python standard library, optional SQLite for sink simulation
No containers/cloud requirement
Kafka concepts (K01)
Python-simulated partitioned, append-only log
No containers; optional single-broker verification lab
First container dependency on the Spark route; scripted, named failure controls
Kafka (K02–K04)
Three-broker local Kafka in reproducible containers
First container dependency on the Kafka route; no cloud account as mandatory dependency
Spark streaming (ST03)
Local sources in local mode first; Kafka-backed variants later; the standalone cluster for the worker-loss-during-query variant
Isolate checkpoint directories per scenario
Flink
Reproducible local/containers
Pin API/runtime and define restore conditions
Integration
Compose only required components
Separate source/sink responsibility and document failure windows
Spark standalone cluster (reference definition)
Topology: one master, three workers, one history server, defined in a pinned Docker Compose file with a shared volume for fixtures, event logs, and output. Per-worker cores and memory are fixed and small enough for a laptop (for example 2 cores / 2 GB each); exact sizes are set and validated during lab development.
Failure controls (scripted, named scenarios):kill-worker <n> (executor and shuffle-file loss → fetch failures and stage re-execution), pause-worker <n> (straggler and speculation), restart-worker <n>, oom-executor (a constrained-memory scenario that produces an OOM-killed executor), and an optional network-throttle control. Each scenario is reproducible by name, not by timing.
·
What this domain owns, and does not
Distributed Data Processing owns computation distribution, partitioning, execution graphs, data movement, shuffles, joins/aggregations, compute state, event-time processing, processing-engine recovery, stream log delivery, runtime performance, batch output commit behavior at the engine layer, testing of distributed computation, and source-to-sink integration reasoning.
It does not own workflow DAG scheduling and business-level backfills (Pipeline Orchestration & Reliability), nor logical data modeling, Parquet/table layout internals, or Iceberg/Delta transaction protocols (Data Modeling & Storage Design). Integrated labs may reference these mechanisms without duplicating their primary instruction.
·
Build order · authoring order (plan §9)
Approve this concept/prerequisite baseline. Maintain the decision log (§11) for any further change to ownership, direct prerequisite edges, OR-slots, or core/advanced status.
Update the companion teaching specification for F04's two new owned concepts (idempotency/scope-naming; testing retry-safe computation), then pilot F01–F04 and G-F, including controlled failures and unit tests. Use the same pilot to validate the Stage 4 decision-record format, the structural pre-check, assessor calibration, and the module-diagnostic format.
Validate teaching efficacy: Ask pilot learners to predict behavior before code execution, fix previously unseen failures, and transfer to an unfamiliar scenario. Observe where they get stuck and refine content.
Build in parallel after the F pilot — these streams do not depend on each other:
S01–S06, including the standalone cluster, its failure controls, and the optional object-store sink; then G-S.
K01–K04, simulator first, then the three-broker cluster; G-K should not require Spark.
ST01–ST02 on local data sources.
Build ST03 once S02 and ST02 exist; introduce Kafka only when it teaches a relevant boundary; then G-ST.
Build I01–I02 and G-I once K04, S03, and ST03 exist. The Flink alternatives for slots J and R are wired in when FL ships; until then the Spark path satisfies them.
FL kickoff: decide the Flink programming language first; then build FL01–FL04 and G-FL; then I03 and G-P, adding the FL alternatives to slots J, R, and FT.
Integrate personalization: Route users using observed competencies, prerequisite diagnostics, and the learner's known engine for OR-slots — not job titles or completed-content counts alone.