Guides
The posts on this site in the order worth reading them, grouped by what you are trying to learn: how Spark executes a query, how the table formats store a table, and which tool to reach for.
- How does Spark actually execute a query?
- Which Spark reference should I keep open?
- How do the table formats store a table?
- How do I run a table format on Spark?
- Which tool do I reach for?
- Everything, newest first
The category and archive pages list everything by topic and by date. This page is different: it puts the posts in a reading order, and says what each one gives you, so you can start somewhere sensible rather than at whatever was published most recently.
Each path is built so that every post assumes only what the ones above it already explained.
How does Spark actually execute a query?
Seven posts that build on each other, from the runtime up to the optimizer and back down to what fails in production. If you read one, read the first.
- Apache Spark architecture is the foundation: who schedules what, how a job becomes stages and tasks, where a shuffle is written, and which component to suspect when a job misbehaves. Everything else here assumes it.
- Inside Spark’s Catalyst optimizer takes one query apart rule by rule: the four trees, what a rule is in the source, and how to switch one off and watch the plan change.
- Adaptive query execution covers what the engine revises once it has measured the data, and, just as usefully, the parts of the plan it never revisits.
- Apache Spark joins in depth is the decision that dominates most jobs: five strategies, why there are five, and how to make each one appear on demand.
- Spark memory management accounts for every region of an executor’s memory and the arithmetic that sizes it, including the one hard floor you cannot tune below.
- Data skew in Apache Spark is the most common way all of the above goes wrong in production, with six fixes and the measurements that tell you which one you need.
- Every Apache Spark release puts the whole thing on a timeline: what each version changed, which defaults moved underneath you, and what a given upgrade is actually worth.
Which Spark reference should I keep open?
These are lookup material rather than a reading order. Open them beside your editor.
- Apache Spark: the complete cheat sheet for the config key, default and syntax you half remember.
- A Spark JVM playbook for custom logging, class loading, stack size and proxy problems, which are the failures that look like Spark bugs and are not.
- 200 Apache Spark interview questions as a self-test over everything above, with answers.
How do the table formats store a table?
Start by choosing, then go deep on the one you chose.
- Open table formats in practice is the comparison: what actually differs between Iceberg, Hudi and Delta Lake, rather than what the marketing pages differ on.
- Apache Hudi: an introduction then Apache Hudi architecture for what happens when you upsert a row, down to bytes on object storage.
- Apache Iceberg architecture for what a commit actually swaps, and why the catalog is part of the table.
- Apache XTable incremental sync for keeping one table readable as more than one format without re-converting everything each time.
The matching cheat sheets are Hudi, Iceberg and XTable.
How do I run a table format on Spark?
The posts where the two halves of the site meet.
- Apache Iceberg through Spark Connect, including the session extension that breaks time travel.
- Apache Hudi through Spark Connect, running the full table surface from a thin client.
- Spark and Hudi logging, for making a write explain itself when it stalls.
Which tool do I reach for?
Small, self-contained utilities and command-line notes.
- Spark Configuration Generator
and Spark Submit Command Formatter
for building and reading long
spark-submitlines. - Spark Submit generator for Iceberg for getting the catalog flags right the first time.
- Inspecting Parquet files with parquet-cli for looking inside a file before blaming the engine.
- Kerberos setup in Linux for the authentication step that blocks everything else.
Everything, newest first
- Every Apache Spark release, and the problem each one was built to solve Sep 2026
- Spark memory management: every region, and the arithmetic that sizes it Sep 2026
- Adaptive query execution in Apache Spark: what it re-plans, and what it leaves alone Sep 2026
- Data skew in Apache Spark: how to see it, and six ways to fix it Sep 2026
- Inside Spark’s Catalyst optimizer: how a query gets rewritten, rule by rule Sep 2026
- Apache Iceberg through Spark Connect: the full surface, and the extension that breaks time travel Sep 2026
- Apache Hudi through Spark Connect: running the full table surface from a thin client Sep 2026
- Apache Spark joins in depth: the five strategies and how one gets picked Sep 2026
- 200 Apache Spark interview questions, with answers Sep 2026
- Spark and Hudi logging: making a write explain itself Sep 2026
- Apache XTable cheat sheet: one table, every format Sep 2026
- Apache Iceberg architecture: what actually happens when you commit Sep 2026
- Apache Hudi architecture: what actually happens when you upsert a row Sep 2026
- Apache Spark architecture: what actually happens when you call an action Sep 2026
- Apache Spark: the complete cheat sheet Sep 2026
- Apache Iceberg on Spark: the complete cheat sheet Sep 2026
- Apache Hudi on Spark: the complete cheat sheet Sep 2026
- Apache Hudi: an introduction to its architecture, features and what makes it different Sep 2026
- Open table formats in practice: what actually differs between Iceberg, Hudi and Delta Lake Sep 2026
- Apache XTable incremental sync: how to keep your conversions fast Sep 2026
- A Spark JVM playbook: custom logging, class loading, stack size and proxies Sep 2026
- Spark Submit Command generator using Iceberg Catalog Jul 2023
- Inspecting Parquet files from the command line with parquet-cli Jan 2023
- Spark Submit Command Formatter tool Jan 2023
- Spark Configuration Generator tool Dec 2021
- Kerberos Setup in Linux Dec 2021