Skip to content

docs(blog): Can a Lakehouse Really Run Maintenance Without Blocking Writes? (MOR series part 4) - #19320

Merged
nsivabalan merged 5 commits into
apache:asf-sitefrom
nsivabalan:asf-site-async-compaction
Jul 20, 2026
Merged

docs(blog): Can a Lakehouse Really Run Maintenance Without Blocking Writes? (MOR series part 4)#19320
nsivabalan merged 5 commits into
apache:asf-sitefrom
nsivabalan:asf-site-async-compaction

Conversation

@nsivabalan

Copy link
Copy Markdown
Contributor

Summary

Fourth post in the MOR-as-architectural-shift blog series.

  • Argues that async compaction (introduced in Hudi in 2019) is not a performance tweak layered onto ingestion, but a direct consequence of separating correctness from optimization — the same principle mature database engines (PostgreSQL VACUUM, RocksDB/LevelDB/Cassandra SSTable compaction, online index rebuilds, checkpointing) have followed for decades.
  • Traces the shift in lakehouse workloads (CDC, streaming, feature stores, AI pipelines) that makes background maintenance an architectural requirement rather than a periodic batch job.
  • Sets up the next post in the series: a head-to-head benchmark of Apache Hudi, Apache Iceberg, and Delta Lake under continuous-ingestion + concurrent maintenance workloads, measuring sustained forward progress rather than raw throughput/latency.

Series so far:

  1. MOR Isn't a Storage Optimization. It's an Architectural Shift
  2. Why Metadata Has to Be Mutation-Friendly
  3. Building Indexes on a Moving Target
  4. Async Compaction: Background Maintenance as an Architectural Primitive (this PR)

Tags

All tags used (mor, merge on read, compaction, architecture, data lakehouse, metadata, clustering) are already in the existing allowlist — no .github/scripts/validate-blog.py change needed.

Test plan

  • `python3 .github/scripts/validate-blog.py website/blog/2026-07-17-async-compaction-background-maintenance.mdx` passes
  • Local site preview renders frontmatter, cover image, and all three inline diagrams at high resolution
  • Tag filter bar surfaces the post under existing tags (`mor`, `merge on read`, `compaction`, `architecture`, `data lakehouse`, `metadata`, `clustering`)
  • Series navigation links to prior three posts and back-references from those posts (if updated) resolve correctly

🤖 Generated with Claude Code

…ural Primitive (MOR series part 4)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actionsgithub-actionsBot added docs size:M PR with lines of changes in (100, 300] labels Jul 17, 2026

@hudi-agenthudi-agent left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 🤖 This review was generated by an AI agent and may contain mistakes. Please verify any suggestions before applying.

No reviewable code files in this PR.

cc @yihua

@nsivabalan

Copy link
Copy Markdown
ContributorAuthor
Screenshot 2026-07-17 at 3 50 30 PMScreenshot 2026-07-17 at 3 50 43 PMScreenshot 2026-07-17 at 3 50 51 PMScreenshot 2026-07-17 at 3 50 59 PMScreenshot 2026-07-17 at 3 51 09 PMScreenshot 2026-07-17 at 3 51 18 PMScreenshot 2026-07-17 at 3 51 29 PMScreenshot 2026-07-17 at 3 51 38 PMScreenshot 2026-07-17 at 3 51 46 PMScreenshot 2026-07-17 at 3 51 55 PMScreenshot 2026-07-17 at 3 52 05 PM

Comment threadwebsite/blog/2026-07-17-async-compaction-background-maintenance.mdx Outdated
Reframe the fourth MoR-series post title from a descriptive ("Async Compaction:
Background Maintenance as an Architectural Primitive") to a question-driven
framing ("Can a Lakehouse Really Run Maintenance Without Blocking Writes?").
The essay is structured as an inquiry — it opens with "should storage optimization
compete with writes, or should it evolve independently?" and answers by walking
through PostgreSQL VACUUM / LSM compaction / online index rebuilds. The prior
title read like a chapter heading. The question form pulls in decision makers
and architects, not just readers who are already sold on the architectural angle.
Filename and URL slug unchanged.
@nsivabalannsivabalan changed the title docs(blog): Async Compaction — Background Maintenance as an Architectural Primitive (MOR series part 4)docs(blog): Can a Lakehouse Really Run Maintenance Without Blocking Writes? (MOR series part 4)Jul 20, 2026

@hudi-agenthudi-agent left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 🤖 This review was generated by an AI agent and may contain mistakes. Please verify any suggestions before applying.

No reviewable code files in this PR.

cc @yihua

Comment threadwebsite/blog/2026-07-17-async-compaction-background-maintenance.mdx Outdated
Comment threadwebsite/blog/2026-07-17-async-compaction-background-maintenance.mdx Outdated
This distinction gave rise to one of the most important architectural ideas in modern databases: **background maintenance**.

<div style={{ textAlign: 'center' }}>
<img src="/assets/images/blog/2026-07-17-async-compaction-background-maintenance/background-maintenance-across-storage-engines.png" alt="Background maintenance across storage engines" width="800"/>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The three PNGs are 1.4-1.8 MB each, so this post ships ~4.8 MB of images. They're full-res RGBA; a pass through pngquant (or exporting as WebP) should cut them ~80% with no visible difference.

Comment threadwebsite/blog/2026-07-17-async-compaction-background-maintenance.mdx Outdated
Apache Hudi's Merge-On-Read architecture adopts the same principle.

<div style={{ textAlign: 'center' }}>
<img src="/assets/images/blog/2026-07-17-async-compaction-background-maintenance/mor-separates-correctness-from-optimization.png" alt="Merge-On-Read separates correctness from optimization" width="800"/>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tiny one, feel free to ignore: this diagram labels the service "Cleaning" while the first diagram says "Cleanup". Hudi's table service is called cleaning, so if either image gets re-exported anyway, worth aligning them.

The benchmark is intentionally simple in concept. Foreground ingestion continuously mutates the table while background services optimize its physical layout. Rather than measuring the latency of an individual write, we observe whether ingestion continues progressing as maintenance runs in parallel.

<div style={{ textAlign: 'center' }}>
<img src="/assets/images/blog/2026-07-17-async-compaction-background-maintenance/benchmark-conceptual-setup.png" alt="Conceptual illustration of the experimental setup" width="800"/>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The figure anonymizes to Format A/B/C, but the paragraph below names Hudi, Iceberg and Delta as the benchmark subjects, and the figure already hands A "continuous forward progress" and C "frequently interrupted" -- before any methodology has been shown. On an ASF blog that reads as announcing the conclusion ahead of the evidence. I'd either frame it as the outcomes the benchmark is designed to distinguish, or hold this figure for the benchmark post itself.

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We have already discussed benchmarking in hudi blogs. This diagram is just to give a teaser for next blog.
we should be good.

Consolidates repeated passages, fixes link and title, updates benchmark figure
caption to avoid pre-announcing conclusions:
- Fix LevelDB link that pointed at rocksdb wiki (wombatu-kun, voonhous)
- Update series list entry #4 with the renamed post title (voonhous)
- Name Iceberg and Delta explicitly in Two Architectural Philosophies (formerly
hedged as "one school of thought") — earns the comparative framing
- Consolidate three repetitions of the 2017/2019/perf-tweak-in-retrospect beat
down to one (in the intro), drop restatements in Two Architectural Philosophies
and the closing section (voonhous)
- Consolidate three restatements of the "principles matter only if they change
behavior under real workloads" question down to one (voonhous)
- Compress the intro paragraph on today's workloads to a forward-pointing
sentence; let The Workloads Changed section own that story (voonhous)
- Reframe the benchmark-conceptual-setup caption to describe the outcomes the
benchmark is designed to distinguish, rather than pre-announcing which
engine lands where (voonhous)
- Add link to /docs/concurrency_control for NBCC so every capability in the
list is followable (voonhous nit)
Trims ~35 lines / ~500 words with no dropped points.
Passes all three PNGs through pngquant (--quality 80-95 --strip), cutting the
post's image payload from ~4.5MB to ~1.4MB (~70%) with no visible quality
change. Addresses voonhous review feedback on page-weight.
- background-maintenance-across-storage-engines.png: 1.4MB -> 410KB
- benchmark-conceptual-setup.png: 1.7MB -> 524KB
- mor-separates-correctness-from-optimization.png: 1.5MB -> 447KB
@nsivabalan

Copy link
Copy Markdown
ContributorAuthor

Thanks @wombatu-kun and @voonhous for the careful review. Pushed two commits addressing the feedback:

  • LevelDB link — now points at google/leveldb/blob/main/doc/impl.md#compactions (both of you flagged this).
  • Series list entry Add hoodie-hive module to support hive registration of hoodie datasets #4 — updated with the new title after the rename.
  • Consolidation pass — applied the concrete cuts you outlined: 2017/2019 framing once (in the intro), "principles only matter if behavior changes" question once (at the end of Separating Correctness from Optimization), workloads story once (in The Workloads Changed), and dropped the redundant closing restatements. Ended up trimming ~35 lines / ~500 words. Also took the opportunity to name Iceberg and Delta explicitly in Two Architectural Philosophies rather than hedging as "one school of thought" — earns the comparative framing.
  • Benchmark figure caption — reframed to describe the outcomes the benchmark is designed to distinguish rather than which engine lands where. Same figure, honest caption.
  • NBCC link — added to /docs/concurrency_control#non-blocking-concurrency-control.
  • PNG sizes — passed all three through pngquant --quality 80-95 --strip. Payload dropped from ~4.5MB to ~1.4MB (~70% smaller), no visible quality change.

Left open (with a note): the Cleaning vs Cleanup label mismatch between the two diagrams — that needs a re-export from the diagram source rather than a text edit. I'll fix it in a follow-up commit if I end up re-exporting either image for other reasons; otherwise flagging for the next post in the series where I can align both from the start.

@hudi-agenthudi-agent left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 🤖 This review was generated by an AI agent and may contain mistakes. Please verify any suggestions before applying.

No reviewable code files in this PR.

cc @yihua

…hies back to 'one school of thought' hedge
Keep the explicit Iceberg/Delta naming in the benchmark-figure paragraph and
the closing footer (which are already explicit about the comparison), and
leave Two Architectural Philosophies with the softer framing to keep the
essay's philosophical tone in that section.

@hudi-agenthudi-agent left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 🤖 This review was generated by an AI agent and may contain mistakes. Please verify any suggestions before applying.

No reviewable code files in this PR.

cc @yihua

@nsivabalan
nsivabalan merged commit 4f69085 into apache:asf-siteJul 20, 2026
1 check passed
voonhous pushed a commit that referenced this pull request Jul 21, 2026
Follow-up to review feedback on #19320. Re-ran the three PNGs in the
async-compaction post through pngquant at --quality 60-80 (previous pass
used 80-95), landing them at ~1.09MB total — a further ~23% reduction on
top of the earlier compression, and ~77% off the original ~4.8MB payload.
No visible quality change on the diagrams (flat colors, text, small palette).
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docssize:MPR with lines of changes in (100, 300]

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@nsivabalan@voonhous@wombatu-kun@hudi-agent