learn-ai-infra-with-phoebe / Practitioner session 3 of 10
Learn AI Infra with Phoebe · Practitioner track · Session 3 of 10

The battleground moved to the catalog

b2 ended with the format war settled directionally. This is where the fight went next, and it is the more consequential one. The catalog is the single API boundary between every engine and every byte you own: it resolves metadata, controls access, vends credentials and sequences commits. Tonight you learn why that makes it the chokepoint of layer two, work through the real implementations, and find the lock-in surface that nobody puts on a comparison slide.

🟡 Practitioner track Platform · DE · architects Vendor-neutral · real rate cards 45 min
0-3 · Welcome 3-18 · Why the catalog is the chokepoint 18-42 · Build-along: evaluating catalogs 42-45 · Q&A
Part 0

Where we are in the stack

Layer two has two halves. b2 took the first half - the table format, the transactional metadata that turns a directory of Parquet files into something you can trust. Tonight takes the second half, and it is the half that holds the chokepoint. The b1 table put it plainly: the chokepoint of layer two is the catalog, and what it decides is access control, credential vending and commit sequencing. That is a governance job wearing a metadata job's name, which is exactly why it gets bought as an afterthought and later turns out to be the thing you cannot change.

Live - presented in session Self-study - read after class Official sources covered
★ What you walk out with today Why the industry fight moved from format to catalog, the four jobs the catalog does and what the Iceberg REST spec unlocked by standardizing them, a working map of the eight real implementations with what each is actually for, the lock-in surface that nobody markets, and three open problems you should be honest about with any vendor who tells you this layer is solved.
Part 1 · the idea

Why the catalog is the chokepoint 9 min live

Recall the chokepoint definition from b1: a narrow waist where plural, messy inputs become a singular, consequential output, and where governance is therefore possible. Above the catalog sits every engine anyone in your organization might run - Spark, Trino, Flink, Dremio, StarRocks, Doris, a notebook, a BI tool, an agent. Below it sits every bucket in every cloud. All of that traffic goes through one box, and that box does four jobs.

Engines above - each one used to need its own connector Spark Trino Flink Dremio StarRocks Doris The catalog - one HTTP API, four jobs 1 · resolves metadata: which files, which snapshot 2 · controls access: row filters, column masks 3 · vends credentials: temporary storage tokens 4 · sequences commits: server-side conflict resolution every engine above, every byte below, one door in between S3 bucket ADLS container GCS bucket on-prem objects The Iceberg REST catalog spec replaced per-engine connectors with plain HTTP. Tier-1 service: if the catalog fails, every lakehouse read and write halts.
🔍 Click to zoom - the narrow waist of layer two, and the four jobs it holds
LiveWhat the Iceberg REST Catalog spec actually unlocked5 min▶

Before the REST spec, catalog access was a per-engine integration problem. Spark talked to Hive Metastore one way. Trino talked to Glue another way. Every engine needed a bespoke connector for every catalog, which meant the number of things to build and maintain was engines times catalogs, and any new capability had to be implemented independently in each cell of that grid. In practice that meant new capabilities did not arrive.

The REST spec replaced all of that with plain HTTP. The catalog became a service with a documented API rather than a library you linked against. That sounds like plumbing. Look at what it made possible, because each item is a governance capability that could not exist before:

  • Credential vending. The catalog hands the engine a scoped, temporary storage credential instead of the engine holding a long-lived key to the whole bucket. Access decisions move from cloud IAM, which knows about prefixes, to the catalog, which knows about tables.
  • Remote signing. The catalog signs individual storage requests, so the engine never holds a credential at all.
  • Server-side commit conflict resolution. Two writers racing on the same table get sequenced by the catalog rather than by whichever client's retry logic happens to be better.
  • Scan planning - and this is the one to underline. The catalog applies row filters and column masks BEFORE returning a plan.

Sit with that last one, because it is the difference between governance and a suggestion. If filtering happens in the engine, then governance is only as strong as every engine's willingness to apply it, and a new engine is a new hole. If the catalog applies the filter during scan planning, the restricted rows are never in the plan the engine receives. The engine cannot read what it was never told exists. That is architecture, not policy - and by the b1 chokepoint test, that is the difference between a control and a suggestion.

Self-studyWhy this fight is bigger than the format fight was3 min read▶

A format is a file layout. If you dislike it, translation is metadata-sized and cheap, as b2 established - XTable and UniForm rewrite nothing. That is precisely why the format war de-escalated: the switching cost turned out to be low, so owning the format stopped being worth fighting for.

A catalog is not a file layout. It holds your access policies, your role hierarchy, your table-level and row-level and column-level rules, your audit trail, and the identity mappings that connect all of it to your organization. None of that is standardized by the REST spec. The spec standardized how an engine asks for a table. It did not standardize how you write "analysts in the EU may see these rows."

So the industry standardized the cheap-to-switch layer and left the expensive-to-switch layer proprietary. That is not a conspiracy, it is the ordinary result of standardizing what everyone agrees on first. But it does mean the interoperability story you are sold at the format layer does not automatically extend one layer up, and Part 3 is about exactly that gap.

Part 2 · build-along

The implementations, and what each is for ★ 12 min · work through it

Eight real options. Read the table with one question in hand rather than a feature checklist: what problem was this built to solve, and is it my problem? Several of these are not competitors at all - they are answers to different questions that happen to share a category name.

Eight options, four decisions - group them by the question they answer What problem are you actually solving? "the open standard, self-hosted" Polaris or Lakekeeper widest interop / OpenFGA "managed, on the platform I picked" Snowflake, Unity, Glue / S3 Tables, BigLake "multi-table branch and merge" Nessie no built-in access control "I already have several catalogs" Gravitino federation, not one catalog Several of these are not competitors - they answer different questions under one name. If the platform is already chosen, the catalog decision is downstream. Say that out loud.
🔍 Click to zoom - pick the question first, and the shortlist writes itself
NameWhat it isNotable
Apache Polaris Open-source catalog implementing the Iceberg REST API Graduated to ASF Top-Level Project 2026-02-19. Published interop across Doris, Flink, Spark, Dremio, StarRocks and Trino - the broadest engine list of any option here
Snowflake Open Catalog Managed Polaris Two-tier RBAC. Credential vending gives the query engine "a temporary storage credential". Free now, with billing expected in H1 2026 on REST API requests - price the request volume before you depend on it
Unity Catalog Databricks' catalog and governance layer The managed product is strong and mature; the open-source variant lags it. Do not evaluate one and deploy the other
AWS Glue / S3 Tables AWS-native catalog, plus managed Iceberg tables in S3 Deepest integration with AWS IAM and the AWS analytics estate. That integration is the benefit and the boundary
Lakekeeper Open-source REST catalog written in Rust PostgreSQL for state, OpenFGA for authorization - a relationship-based access model rather than a bolted-on role table
Nessie Catalog with git-like branching and tagging Branch, merge and time-travel across multiple tables at once. No built-in access control - this is a workflow answer, not a governance answer
Apache Gravitino Federated metadata catalog across sources ASF Top-Level Project June 2025. Aimed at the "we already have four catalogs" problem rather than the "we need one" problem
BigLake Metastore Google Cloud's managed metastore The GCP-native equivalent of the Glue position, with the same trade shape
LiveHow to read that table without a feature matrix4 min▶

Group them by the question they answer and eight options become four decisions:

  • "I want the open standard, self-hosted" - Polaris or Lakekeeper. Polaris has the widest published engine interop; Lakekeeper's OpenFGA authorization model is the more interesting choice if fine-grained permissions are your actual pain.
  • "I want it managed, and I have already picked a platform" - Snowflake Open Catalog, Unity Catalog, Glue / S3 Tables or BigLake Metastore. Here the catalog decision is mostly downstream of a decision you already made, which is worth naming out loud rather than pretending it is an open evaluation.
  • "I need multi-table branching and merge workflows" - Nessie, with clear eyes about the missing access control. Teams adopt Nessie for its development workflow and then discover governance is a separate project.
  • "I already have several catalogs and cannot consolidate" - Gravitino. Federation is the honest answer to an organizational fact, not a technical preference.
Real world

Note the pricing line on Snowflake Open Catalog, because it is the kind of thing that quietly changes an architecture. It is free today, with billing expected in H1 2026 on REST API requests. A catalog is called on every table resolution, every plan, every commit - which means the meter, when it arrives, runs on query patterns rather than on data volume. A chatty BI tool refreshing dashboards every five minutes generates catalog requests in a completely different order of magnitude from a nightly batch job over the same tables. Ask for the request-volume estimate before the price exists, not after.

Self-studyFive questions to put to any catalog vendor3 min read▶

Take these into your next evaluation. Each maps to something on this page.

  • "Show me a row filter being applied during scan planning." Not in the engine. In the plan the engine receives. If it is applied downstream, every new engine is a new hole.
  • "What exactly does an engine hold - a long-lived key, a vended temporary credential, or nothing because you sign requests?" Three very different blast radiuses when a client is compromised.
  • "If I write my row-level and column-level policies here, what is the export path?" Expect discomfort. Part 3 explains why.
  • "What is your availability target, and what happens to reads and writes when you are down?" Answered honestly, this is a tier-1 conversation.
  • "Which capabilities exist in the managed product but not in the open-source one?" Ask specifically about governance features, which is where the gap usually sits.
Part 3 · the part nobody markets

Governance portability is the real lock-in surface 9 min live

Here is the sentence this session exists to deliver. Row-level security written in Unity Catalog does not transfer to Polaris. Not "transfers with effort" - there is no standard target format to transfer it into. The REST spec standardized how an engine asks for a table; it did not standardize how you express who may see which rows. So every policy you author accumulates in one vendor's dialect, and the pile grows every quarter.

Two layers are portable and loudly marketed. The third is neither. Your data files Parquet, and always were PORTABLE Nothing to translate. The files were never the problem. Your table metadata Iceberg, Delta, Hudi PORTABLE Translation is metadata-sized and cheap - XTable rewrites nothing. Your governance row filters, masks, roles, tags NOT PORTABLE No standard target format exists to transfer it into. Not with effort. Row-level security written in Unity Catalog does not transfer to Polaris. It is also the only one of the three that took risk, legal and audit two years to write. Vendors compete loudly on the two portable layers and stay quiet about the third. Author policies as code in your own repo, so migration is a re-render, not a rewrite.
🔍 Click to zoom - the layer nobody markets is the one you cannot take with you
Where the switching cost actually sits Your data files are portable - Parquet, and always were. Your table metadata is portable - translation is metadata-sized and cheap, per b2. Your governance is not portable, and it is the only one of the three that took two years of negotiation with your risk, legal and audit functions to write. Vendors compete loudly on the two portable layers and stay quiet about the third. That asymmetry is the whole lock-in story of layer two, and it is why the fight moved here.
LiveThree unsolved problems - teach them as open questions5 min▶

Any vendor who tells you this layer is solved is selling. These three are genuinely open, and the useful posture is to name them and design around them rather than wait for someone to close them.

  • 1 · Governance portability. No standard exists for expressing row filters, column masks, role hierarchies or tag-based policies across catalogs. Practical mitigation: author your policies as code in your own repository and apply them to the catalog, so that the source of truth is a file you own rather than a state you accumulated by clicking. That does not make migration free, but it turns a rewrite into a re-render.
  • 2 · The open-versus-managed parity gap. The open-source variant of a managed catalog routinely lags the managed one, and it lags most in governance features specifically - which are the expensive ones to reimplement. Evaluating the open-source version and deploying the managed version, or the reverse, produces a surprise in month four rather than in week one.
  • 3 · Operational reliability. The catalog is a tier-1 service: if it fails, all lakehouse reads and writes halt. Not degrade - halt. Every engine resolves every table through it. Many teams deploy a catalog with the operational care of a metadata service and then discover they have made it the availability floor of the entire data platform. Ask for the SLO, the failure modes, the backup and restore procedure for catalog state, and whether anyone has ever practised the restore.

Now apply the b1 chokepoint test explicitly: what stops someone from going around the catalog? On a lakehouse, the honest answer is often "a direct read from the object store with cloud credentials." If any engine, notebook or service can read the Parquet directly with bucket-level IAM permissions, every row filter and column mask in your catalog governs only the well-behaved path. The catalog is a genuine chokepoint only when storage-level access has been closed off in favour of catalog-vended credentials. Credential vending is not a convenience feature. It is the mechanism that makes the chokepoint real, and without it you have a suggestion with excellent documentation.

LiveLineage: what it buys, and why it should not be a project4 min▶

Lineage is the record of which inputs produced which outputs, at table and ideally column granularity. Four things it buys, all of them boring until the day you need them:

  • Impact analysis - before you change a column, know who breaks.
  • Root-cause analysis - a dashboard is wrong, and lineage turns "somewhere upstream" into a short list.
  • Regulatory evidence - showing where a personal-data field came from and where it went, on demand.
  • Deprecation - the only way to retire a table with confidence rather than by deleting it and waiting for complaints.

The trap is treating lineage as a procurement item: buy a lineage tool, run parsers over your SQL, produce a graph that is 70% accurate and stale by Thursday. It is expensive and it decays, because it is reconstructing after the fact something the system knew at the time and threw away.

The alternative is structural. In an asset-based orchestrator, you declare the assets and their dependencies as the way you author work in the first place, so a successful run means "this table exists at this version, produced from these inputs." Lineage falls out of that as a by-product rather than a separate project, and it is accurate by construction because it is the same declaration the scheduler executed. That is a change in what "the pipeline succeeded" even means, and it is the heart of b4, where we take orchestration properly and choose between tools by failure semantics rather than by feature list.

Homework

Try it yourself - this week ◐ 30 min total

Source material

Official sources covered

Specifications and project documentation first, vendor documentation second and labelled as such, practitioner commentary last and bias-flagged. This page covers:

✓Apache Iceberg REST Catalog specification and Iceberg project documentationThe four jobs, credential vending, remote signing, commit resolution, scan planning with filters
✓Apache Polaris project documentation and ASF Top-Level Project graduation (2026-02-19)The reference open implementation · published engine interop list
✓Snowflake Open Catalog documentationTwo-tier RBAC, the credential-vending quote, and the H1 2026 billing expectation on REST requests
◐Unity Catalog, AWS Glue / S3 Tables, Lakekeeper, Nessie, Gravitino, BigLake docsVendor and project sources · used for positioning, not for comparative claims
◐Practitioner commentary on catalog interoperabilityBias flag: developer-advocate source with a vendor affiliation · used only where it matches primary docs
Check yourself

Three questions before you go 🎯 ◐ 90 seconds

1 · The Iceberg REST Catalog spec replaced per-engine connectors with plain HTTP. What did that unlock that matters most for governance?

Spark talked to Hive Metastore one way and Trino talked to Glue another; every capability had to be built per engine, so it was not built. The scan-planning item is the sharpest: if the restricted rows are never in the plan, the engine cannot read what it was never told exists.

2 · Your data is Parquet, your tables are Iceberg, and everything is open. Where is the lock-in?

Data files are portable and table metadata translates cheaply, per b2. Governance is the one layer with no standard, and it is the layer that took two years of negotiation with risk, legal and audit to write. That asymmetry is the whole lock-in story.

3 · Why should the catalog be treated as a tier-1 service?

The catalog holds no data - and that is exactly why the failure is total rather than partial. Teams deploy it with the operational care of a metadata service and then discover it is the availability floor of the whole platform. Ask for the SLO and whether anyone has ever practised the restore.

Practitioner session 3 cheat sheet · pin this

The moveThe battleground went from format to catalog. Formats translate cheaply; catalogs hold policy, and policy does not translate at all.
The four jobsResolve metadata · control access · vend credentials · sequence commits. One API boundary between every engine and every byte.
What REST unlockedCredential vending, remote signing, server-side commit conflict resolution, and scan planning with row filters and column masks applied before the plan returns.
Open implementationsPolaris (TLP 2026-02-19, widest engine interop) · Lakekeeper (Rust, PostgreSQL, OpenFGA) · Nessie (git-like branching, no built-in access control) · Gravitino (federated, TLP June 2025).
Managed implementationsSnowflake Open Catalog (managed Polaris, two-tier RBAC, free now, billing expected H1 2026 on REST requests) · Unity Catalog · AWS Glue / S3 Tables · BigLake Metastore.
THE LOCK-INGovernance portability. Row-level security written in Unity Catalog does not transfer to Polaris. Author policy as code you own.
The chokepoint test hereIf anything can read the Parquet directly with bucket credentials, every catalog filter governs only the well-behaved path. Credential vending is what makes it real.
Three open problems + lineagePortability · open-vs-managed parity · tier-1 reliability (catalog down = all reads and writes halt). Lineage should be an orchestrator by-product, not a project - see b4.