Back to Journal
Data Engineering 18 December 2024 14 min read Sheece Gardezi

Zarr 3 + Icechunk: Git for Petabyte-Scale Arrays

Icechunk adds transactional commits, branching, and time travel to Zarr 3 arrays on object storage. Version control for multi-dimensional scientific data, not just code.

ZarrCloud NativeScientific ComputingIcechunkData Lakes
NASA satellite view of Earth showing atmospheric patterns
NASA on Unsplash

NASA, NOAA, and ECMWF already distribute petabytes of climate and satellite data in Zarr format. Zarr 3's async rewrite delivers 2-5x faster reads on cloud object storage. Icechunk 1.0, released July 2025, adds atomic commits, branch management, and time-travel queries on top -- turning a storage format into a versioned data lake with single-digit-percent write overhead.

Why Zarr 2's Synchronous Core Hit a Wall

Zarr v2 solved the fundamental problem of chunked, compressed N-dimensional arrays on cloud object storage. But years of production use at NASA, NOAA, and Copernicus exposed a bottleneck: synchronous I/O. On S3 or GCS, each chunk fetch incurs 50-200ms of latency. Zarr 2 issued these requests sequentially.

Zarr-Python 3, released late 2024, is a ground-up rewrite with an async core. It parallelizes chunk fetches to saturate network bandwidth, supports sharding (grouping multiple chunks into single storage objects), and introduces pluggable codec pipelines. The result is 2-5x faster reads on cloud storage with no application-level code changes for Xarray users.

The new asynchronous core enables efficient I/O operations and better utilization of system resources. Multiple I/O operations can be performed concurrently, leading to faster data access and reduced latency—especially when data is stored on cloud object storage.
Zarr Development Team

Five Architectural Changes in the v3 Rewrite

Core Improvements

Fully asynchronous core

Built on Python's asyncio for concurrent I/O operations, dramatically faster on cloud storage

Sharding support

Groups multiple chunks into single storage objects, improving performance on small-chunk workloads

Extensible store ABC

New abstract base class for custom storage backends—S3, GCS, Azure, or your own

Custom codec pipelines

Python entry points for defining compression and transformation codecs

Multi-scale features

Native support for pyramids and overviews in array hierarchies

Sharding deserves emphasis. Time-series satellite data often produces millions of small chunks. Zarr 2's one-file-per-chunk model overwhelms object stores with metadata operations. Sharding groups multiple chunks into single storage objects, reducing metadata overhead by 10-100x while maintaining random access to individual chunks.

Xarray Integration: Zero Application Code Changes

Most users access Zarr through Xarray. The integration is transparent -- xr.open_zarr() auto-detects v2 vs. v3 format and handles chunked lazy loading. Opening a multi-terabyte dataset takes milliseconds; only metadata is fetched. Computation triggers I/O for just the chunks needed.

zarr_xarray_example.py
import xarray as xr
import zarr

# Open dataset with Zarr-Python 3
ds = xr.open_zarr(
    "s3://climate-data/era5.zarr",
    storage_options={"anon": True},
    consolidated=True
)

# Lazy loading—only metadata fetched
print(ds)  # Shows dimensions, coords, variables

# Compute on specific region—only needed chunks loaded
subset = ds.temperature.sel(
    lat=slice(40, 50),
    lon=slice(-10, 10),
    time="2024"
).mean(dim="time")

result = subset.compute()  # Triggers actual I/O

Icechunk: Atomic Commits and Branching for Array Data

Zarr solves the storage format problem. Production data lakes face a different challenge: concurrent writers, data consistency, and rollback for failed pipelines. Icechunk layers transactional semantics on top of Zarr 3.

The model works like Git. Reading from an Icechunk store checks out a specific snapshot. Other writers can commit changes without affecting your view until you explicitly pull updates. Analyses reference exact dataset versions -- reproducibility becomes a property of the storage layer, not a discipline imposed on users.

What Icechunk Adds to Zarr

  • Transactional commits — All changes committed atomically, no partial writes
  • Snapshot isolation — Read from fixed points in history while others write
  • Branch management — Multiple branches can coexist, like Git repositories
  • Conflict detection — Automatic detection when concurrent writers modify same data
  • Time travel queries — Access any historical state of your dataset
icechunk_workflow.py
from icechunk import IcechunkStore, StorageConfig
import zarr

# Create Icechunk store on S3
storage = StorageConfig.s3_from_env(
    bucket="my-data-lake",
    prefix="climate-analysis"
)
store = IcechunkStore.create(storage)

# Open as Zarr group
root = zarr.group(store=store)
root.create_dataset("temperature", shape=(1000, 180, 360))

# Commit changes with message
store.commit("Initial temperature array")

# Later: create branch for experimental analysis
store.new_branch("experimental")
root["temperature"][0] = new_data
store.commit("Experimental calibration")

# Switch back to main, original data untouched
store.checkout(branch="main")

Icechunk 1.0: Forward-Compatible Storage Guarantee

Icechunk 1.0, released July 2025, ships an explicit stability contract: data written by 1.0+ will be readable by all future versions. For organizations building decade-scale climate archives, that commitment is non-negotiable.

Under the hood, Icechunk maintains a manifest tracking chunk locations across snapshots. Modifying a single chunk rewrites only that chunk -- the rest of the dataset shares storage with previous snapshots via deduplication. Write overhead is single-digit percentages. Read performance is identical to raw Zarr, since chunk data is stored in the same format.

Adoption: NASA, NOAA, ECMWF, and the CMIP6 Archive

Zarr has become the default array format for the largest Earth science organizations:

  • NASA — Earth observation data products and climate archives
  • NOAA — Weather model outputs and forecast ensembles
  • ECMWF — Global atmospheric reanalysis datasets
  • Copernicus — Sentinel satellite data distribution
  • Pangeo — Community-driven cloud-native geoscience

The CMIP6 climate model archive, one of the largest scientific datasets ever assembled, is increasingly distributed in Zarr format. Cloud-optimized versions enable researchers to query specific variables, time periods, and regions without downloading complete model outputs.

VirtualiZarr: Zarr Access to NetCDF/HDF5 Without Conversion

Not every organization can reprocess decades of archives. VirtualiZarr creates virtual Zarr stores that reference chunks within existing NetCDF, HDF5, or GRIB files. Data stays in place; only lightweight reference manifests are created. Users get Zarr's chunked access patterns on legacy data originally designed for download-and-process workflows.

Benchmarks: Async I/O and Sharding Impact

The Zarr team's benchmarks: async I/O provides 2-5x speedups on S3/GCS compared to synchronous v2 access. Sharding reduces metadata operations by 10-100x for small-chunk workloads. Icechunk's manifest updates are append-only with background compaction, adding single-digit-percent overhead to writes.

Migration Path: v2 Compatibility, v3 for New Stores

Zarr-Python 3 reads v2 stores without modification. New stores should use v3 format. Teams needing version control should evaluate Icechunk. The ecosystem is production-ready and under active development.

The larger pattern: GeoParquet for vector data, COG for raster imagery, Zarr for multi-dimensional arrays. Together they form a coherent cloud-native stack that replaces proprietary formats and monolithic GIS databases. Zarr 3 + Icechunk is the array piece reaching maturity.

Have a project in mind?

Location

  • Canberra
    ACT, Australia