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.
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.
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.
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.
| Name | What it is | Notable |
|---|---|---|
| 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.
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.
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.
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.
Try it yourself - this week ◐ 30 min total
- Name your catalog, in one sentence, without hedging. A surprising number of teams have two or three and have never said so out loud. If you have more than one, write down which engines use which, and whether a policy written in one is visible from the other.
- Apply the chokepoint test to your storage: can any engine, notebook, service account or person read the underlying Parquet directly with bucket-level credentials, bypassing the catalog entirely? Count the paths. Every path you find is a row filter that does not apply.
- Inventory your governance policies - row filters, column masks, roles, tags. Estimate how long they took to negotiate and write. That estimate, not the licence fee, is your true switching cost for this layer.
- Ask your catalog owner two questions: what is the SLO, and has anyone ever restored catalog state from backup in a drill? If the answer to the second is no, you are running a tier-1 service on an untested recovery path.
- If you use a managed catalog with a free tier, estimate your monthly REST request volume from your query patterns, not your data volume. Then ask what happens when it is metered.
Official sources covered
Specifications and project documentation first, vendor documentation second and labelled as such, practitioner commentary last and bias-flagged. This page covers:
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.