Apache Iceberg has made it much easier to build analytical tables on object storage, but there is another component that data platforms need to think about: the catalog.

An Iceberg table is not just a collection of Parquet files. Engines need to know where a table lives, which metadata file represents its current state, how the schema has evolved, and how concurrent changes should be handled.

That information is normally provided by an Iceberg catalog.

Google Cloud has introduced a new capability that allows Spanner to act as a runtime catalog for Apache Iceberg tables. The catalog information is stored in Spanner while the actual Iceberg table data and metadata remain in object storage.

The architecture is interesting because it combines two very different systems:

Apache Iceberg
      |
      +---- Table Data
      |       |
      |       v
      |    Object Storage
      |
      +---- Catalog
              |
              v
           Spanner

Spanner does not become the storage engine for the analytical data.

It becomes the transactional control plane that helps applications and query engines discover and manage Iceberg tables.

Why Iceberg Needs a Catalog

An Iceberg table typically consists of data files plus metadata.

A simplified table might look like:

orders/
    data/
        file-001.parquet
        file-002.parquet

    metadata/
        v1.metadata.json
        v2.metadata.json
        v3.metadata.json

A query engine needs to determine which metadata represents the current table state.

It also needs to understand things such as:

Table location
Schema
Partition specification
Snapshots
Current snapshot
Metadata files
Table properties

That information is managed through an Iceberg catalog.

Without a catalog, each engine would need to discover and manage table metadata independently.

The catalog provides a consistent namespace and a mechanism for locating the current table metadata.

What Spanner Adds

Spanner is a globally distributed relational database designed around strong consistency and horizontal scalability.

Using it as an Iceberg catalog brings a transactional database into the control plane of the data lake.

The architecture can be viewed as two separate layers:

                  Data Plane
              ------------------
              Iceberg Data Files
                     |
                     v
               Object Storage


                 Control Plane
              ------------------
                    Spanner
                     |
                     v
              Iceberg Catalog

This separation is useful.

The analytical data can remain in inexpensive object storage while Spanner manages the transactional information required to coordinate access to the tables.

Google describes this architecture as using Spanner's transactional capabilities to provide a reliable catalog for Iceberg tables while keeping the actual table data in object storage.

Why Use a Database as the Catalog?

At first glance, a catalog does not seem like something that needs a globally distributed relational database.

But modern data platforms increasingly have many writers and readers.

Consider:

              Iceberg Catalog
                    |
       +------------+------------+
       |            |            |
       v            v            v
     Spark        Trino        Flink
       |            |            |
       +------------+------------+
                    |
                    v
              Object Storage

Multiple engines may be reading and writing the same tables.

The catalog therefore becomes an important coordination point.

If two writers try to update the same table simultaneously, the system needs a reliable way to coordinate those changes.

Transactional semantics can make this easier to manage.

That is where Spanner becomes interesting.

Strong Consistency at the Catalog Layer

Spanner provides externally consistent transactions and strong consistency across its distributed architecture.

Using those characteristics for the Iceberg catalog can help coordinate metadata operations.

Imagine two processes attempting to update a table:

Writer A
   |
   +---- Update Table
   |
   v
Spanner


Writer B
   |
   +---- Update Same Table
   |
   v
Spanner

The catalog can use transactional behavior to coordinate the updates rather than allowing both writers to blindly publish conflicting table states.

This is particularly relevant in data platforms where many pipelines operate concurrently.

The data files remain in object storage, but the catalog provides a strongly managed control point.

Runtime Catalog vs Data Storage

One important distinction is that Spanner does not replace the object store.

An Iceberg table might still use:

Object Storage
   |
   +---- Parquet data
   +---- Iceberg metadata
   +---- Manifest files
   +---- Delete files

Spanner maintains the catalog information that tells clients how to locate and interact with those tables.

That separation is useful because different storage technologies are optimized for different jobs.

Object storage is well suited to large analytical files.

Spanner is well suited to transactional metadata and coordination.

The architecture therefore becomes:

             Query Engine
                  |
                  v
              Spanner
             Catalog
                  |
                  v
           Iceberg Metadata
                  |
                  v
           Object Storage
                  |
                  v
            Data Files

Why This Matters for Multi-Engine Analytics

One of Iceberg's major advantages is that it is not tied to a single query engine.

Organizations can use different engines for different workloads.

For example:

             Iceberg Table
                   |
        +----------+----------+
        |          |          |
        v          v          v
      Spark      Trino      Flink
        |          |          |
        +----------+----------+
                   |
                   v
              Object Store

A common catalog gives those engines a shared view of the table namespace.

This is especially useful when one organization uses Spark for batch processing, Flink for streaming, and another engine for interactive SQL.

The catalog becomes a common control plane rather than forcing every engine to maintain its own independent table registry.

The Catalog Is Part of the Data Architecture

Data engineers sometimes focus heavily on:

Storage
Compute
Network

and treat the catalog as configuration.

That can be a mistake.

The catalog influences:

Table discovery
Concurrency
Schema evolution
Snapshot management
Data access
Engine interoperability
Governance

If the catalog becomes unavailable, applications may still have the underlying data files, but discovering and correctly interpreting the current table state becomes much harder.

That makes catalog availability an architectural concern.

A Practical Example

Imagine a company operating a large customer-events platform.

The raw events are stored as Iceberg tables:

customer_events
    |
    +---- event_time
    +---- customer_id
    +---- event_type
    +---- payload

The actual Parquet files live in object storage.

Several pipelines interact with the table:

Streaming Pipeline
        |
        v
     Iceberg

Batch ETL
        |
        v
     Iceberg

Analytics
        |
        v
     Iceberg

ML Pipeline
        |
        v
     Iceberg

Spanner provides the catalog:

                 Spanner
                   |
            Iceberg Catalog
                   |
       +-----------+-----------+
       |           |           |
     Spark       Flink       SQL
       |           |           |
       +-----------+-----------+
                   |
                   v
              Object Store

Now the table's control metadata is handled through a transactional system while the data remains in object storage.

Concurrency Is a Major Reason to Care

Imagine a table receives updates from several pipelines.

At roughly the same time:

Pipeline A -> Add Data
Pipeline B -> Update Schema
Pipeline C -> Compact Table

These operations can touch related table metadata.

A catalog needs to make sure that readers do not end up seeing an invalid or partially committed table state.

Iceberg itself uses optimistic concurrency control for table updates.

A catalog built on a transactional database can provide a strong foundation for the coordination required around those operations.

The important point is that Spanner does not change Iceberg's fundamental table format.

It provides a transactional implementation for the catalog layer.

Global Applications Are Another Interesting Use Case

Spanner's distributed architecture is particularly relevant when an organization operates across geographic regions.

An application may have workloads such as:

US
EU
Asia

while still needing a consistent catalog.

The catalog may need to answer:

Where is this table?
Which metadata is current?
What is the current snapshot?
Which schema version should readers use?

A globally distributed transactional database can be useful when those operations need strong consistency across locations.

That does not mean every data lake needs a globally distributed catalog.

If the workload is small and regional, the additional infrastructure may provide little benefit.

The value increases when the data platform itself is distributed.

Catalog and Data Residency

There is another architectural consideration.

If the data files are stored in a specific geography, the catalog metadata may still contain information about those datasets.

That means teams should evaluate the catalog's own data location and governance requirements.

A sovereignty-aware architecture therefore needs to consider:

Data files
   |
   +---- Region
   |
   +---- Encryption

Catalog
   |
   +---- Region
   |
   +---- Access
   |
   +---- Audit

Processing
   |
   +---- Region
   |
   +---- Identity

The fact that the data itself stays in one location does not automatically mean the entire data platform satisfies the same residency requirements.

The catalog is part of the platform.

Schema Evolution Still Belongs to Iceberg

Spanner does not replace Iceberg's schema management.

Suppose the original table contains:

customer_id
event_type
event_time

Later, the schema evolves:

customer_id
event_type
event_time
device_type

Iceberg remains responsible for representing the table schema and its evolution.

Spanner's role is to provide the catalog layer that points clients to the appropriate Iceberg metadata.

That separation is worth keeping clear:

Iceberg
  -> Table semantics
  -> Schema
  -> Snapshots
  -> Metadata

Spanner
  -> Catalog
  -> Namespace
  -> Transactional coordination

Object Storage
  -> Data files
  -> Metadata files

Each layer has a different responsibility.

Why This Could Simplify Data Platforms

One reason organizations adopt Iceberg is to avoid locking analytical data into a proprietary table format.

But open table formats can create their own operational questions.

Teams need to decide:

Which catalog?
How is it hosted?
How is it secured?
How does it scale?
How is concurrency handled?
How do engines connect?

A managed Spanner-backed catalog can reduce some of that infrastructure work.

Instead of building a custom catalog service, organizations can use a transactional database designed for distributed workloads.

That does not eliminate operations completely, but it can move the responsibility toward a familiar managed database model.

Common Mistakes

Thinking Spanner Stores the Iceberg Data

It does not.

The actual analytical data remains in object storage.

Spanner provides the catalog layer.

Treating the Catalog as Optional Infrastructure

The catalog is part of how engines discover and coordinate access to Iceberg tables.

Its availability and consistency can directly affect the data platform.

Ignoring Catalog Permissions

A user who can discover a table does not necessarily need unrestricted access to the underlying data.

Catalog permissions and data permissions should be designed separately.

Assuming Every Iceberg Engine Behaves the Same Way

Different engines can have different levels of support for Iceberg features and catalog implementations.

Test the complete combination used by the organization.

Choosing a Distributed Catalog Without a Distributed Requirement

Spanner brings useful distributed and transactional capabilities.

If the data platform is small and regional, those capabilities may not justify the additional architecture.

Advantages and Disadvantages

Advantages

The catalog gets transactional infrastructure. Spanner provides strong consistency and distributed transaction capabilities that are useful for coordinating catalog operations.

Iceberg data remains in object storage. Organizations can continue using object storage for the large analytical data while using Spanner only for the control plane.

Multiple engines can share a catalog. Spark, Flink, Trino, and other Iceberg-compatible engines can use the same table namespace when configured appropriately.

The architecture separates control and data planes. This makes it easier to reason about the responsibilities of storage, metadata, and transactional coordination.

Distributed data platforms get a globally capable catalog option. Spanner's architecture can be useful for organizations operating data workloads across multiple geographic locations.

Disadvantages

It adds another infrastructure component. Teams now need to understand and operate the relationship between Spanner, Iceberg, and object storage.

Spanner may be unnecessary for smaller workloads. A simple regional data platform may not need the distributed transactional capabilities of Spanner.

Compatibility still matters. Every query engine and data-processing system needs to support the chosen Iceberg catalog implementation correctly.

Catalog availability becomes another dependency. If the catalog is unavailable, discovering current table state can become difficult even when the underlying data files remain accessible.

When a Spanner-Based Iceberg Catalog Makes Sense

This architecture is most interesting for organizations building large, distributed analytical platforms with several Iceberg consumers.

Typical examples include:

Large data lakes
Multi-engine analytics
Distributed data platforms
Streaming and batch workloads
Global analytical applications
AI and ML data platforms
Organizations already using Spanner

It is less compelling for a small data lake with one processing engine and a simple catalog requirement.

In that environment, a simpler catalog may be easier to operate and cheaper to maintain.

Summary

Using Spanner as a runtime catalog for Apache Iceberg creates an interesting separation between the data plane and the control plane.

The large analytical files remain in object storage. Iceberg continues to define table semantics, schemas, snapshots, and metadata. Spanner provides the transactional catalog layer that helps applications and query engines discover and coordinate access to those tables.

That separation is the key architectural idea.

The value is not that Spanner becomes a faster place to store Parquet files. It is that a distributed transactional database can provide a strong foundation for the metadata and coordination layer that sits above those files.

For organizations running multiple analytics engines, distributed pipelines, and globally deployed data workloads, the catalog can become an important piece of infrastructure rather than an afterthought.

The trade-off is complexity.

Teams should choose a Spanner-backed Iceberg catalog because the workload actually benefits from distributed consistency, transactional catalog operations, and shared access across engines, not simply because both Spanner and Iceberg are capable technologies.

For large data platforms, though, the architecture points toward an increasingly important pattern: keep analytical data in scalable object storage while using a strongly consistent database to manage the control plane around it.