Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Overview

In this tutorial we are going to use a large collection of pre-generated Kerchunk reference files and open them with Xarray’s new DataTree functionality. This chapter is heavily inspired by this blog post.

About the Dataset

This collection of reference files were generated from the NASA NEX-GDDP-CMIP6 (Global Daily Downscaled Projections) dataset. A version of this dataset is hosted on s3 as a collection of NetCDF files.

Prerequisites

ConceptsImportanceNotes
Kerchunk BasicsRequiredCore
Multiple Files and KerchunkRequiredCore
Kerchunk and DaskRequiredCore
Multi-File Datasets with KerchunkRequiredIO/Visualization
Xarray-Datatree OverviewRequiredIO
  • Time to learn: 30 minutes

Motivation

In total the dataset is roughly 12TB in compressed blob storage, with a single NetCDF file per yearly timestep, per variable. Downloading this entire dataset for analysis on a local machine would difficult to say the least. The collection of Kerchunk reference files for this entire dataset is only 272 Mb, which is about 42,000 times smaller!

Imports

Loading...
Loading...
Loading...
Loading...

Read the reference catalog

The NASA NEX-GDDP-CMIP6 dataset is organized by GCM, Scenario and Ensemble Member. Each of these Scenario/GCM combinations is represented as a combined reference file, which was created by merging across variables and concatenating along time-steps. All of these references are organized into a simple .csv catalog in the schema:

GCM/Scenariourl

Organzing with Xarray-Datatree

Not all of the GCM/Scenario reference datasets have shared spatial coordinates and many of the have slight differences in their calendar and thus time dimension. Because of this, these cannot be combined into a single Xarray-Dataset. Fortunately Xarray-Datatree provides a higher level abstraction where related Xarray-Datasets are organized into a tree structure where each dataset corresponds to a leaf.

Load Reference Datasets into Xarray-DataTree

In the following cell we create a function load_ref_ds, which can be parallelized via Dask to load Kerchunk references into a dictionary of Xarray-Datasets.

Use Dask Distributed to load the Xarray-Datasets from Kerchunk reference files

Using Dask, we are loading 164 reference datasets into memory. Since they are are Xarray datasets the coordinates are loaded eagerly, but the underlying data is still lazy.

Loading...
2026-09-26 03:00:31,502 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-f971ea6c-d800-422b-a556-53e3fd88881a
State:     executing
Task:  <Task 'load_ref_ds-f971ea6c-d800-422b-a556-53e3fd88881a' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

2026-09-26 03:00:31,513 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-ebd5c310-a33b-4dd6-a45a-61e4fab9b714
State:     executing
Task:  <Task 'load_ref_ds-ebd5c310-a33b-4dd6-a45a-61e4fab9b714' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

2026-09-26 03:00:31,522 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-e3cbc496-32fd-484e-9fa0-7c31084d2ba6
State:     executing
Task:  <Task 'load_ref_ds-e3cbc496-32fd-484e-9fa0-7c31084d2ba6' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

2026-09-26 03:00:31,560 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-d29ab796-d558-46e8-b7a1-a30c035490c3
State:     executing
Task:  <Task 'load_ref_ds-d29ab796-d558-46e8-b7a1-a30c035490c3' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

2026-09-26 03:00:31,571 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-addaee77-6cb7-4da3-b856-a36529be1886
State:     executing
Task:  <Task 'load_ref_ds-addaee77-6cb7-4da3-b856-a36529be1886' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

2026-09-26 03:00:31,623 - distributed.worker - ERROR - Compute Failed
Key:       load_ref_ds-618ed338-986f-4699-93cb-e42c4b499eaa
State:     executing
Task:  <Task 'load_ref_ds-618ed338-986f-4699-93cb-e42c4b499eaa' load_ref_ds(...)>
Exception: 'ValueError("Reference-FS\'s target filesystem must have same value of asynchronous")'
Traceback: '  File "/tmp/ipykernel_5482/3963997076.py", line 10, in load_ref_ds\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py", line 613, in open_dataset\n    backend_ds = backend.open_dataset(\n        filename_or_obj,\n    ...<2 lines>...\n        **kwargs,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1741, in open_dataset\n    store = ZarrStore.open_group(\n        filename_or_obj,\n    ...<10 lines>...\n        cache_members=cache_members,\n    )\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 771, in open_group\n    ) = _get_open_params(\n        ~~~~~~~~~~~~~~~~^\n        store=store,\n        ^^^^^^^^^^^^\n    ...<9 lines>...\n        zarr_format=zarr_format,\n        ^^^^^^^^^^^^^^^^^^^^^^^^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py", line 1983, in _get_open_params\n    zarr_group = zarr.open_group(store, **open_kwargs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py", line 552, in open_group\n    sync(\n    ~~~~^\n        async_api.open_group(\n        ^^^^^^^^^^^^^^^^^^^^^\n    ...<11 lines>...\n        )\n        ^\n    )\n    ^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 156, in sync\n    raise return_result\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py", line 116, in _runner\n    return await coro\n           ^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py", line 859, in open_group\n    store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 482, in make_store_path\n    store = await make_store(store_like, mode=mode, storage_options=storage_options)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py", line 414, in make_store\n    return FsspecStore.from_mapper(store_like, read_only=_read_only)\n           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 209, in from_mapper\n    fs = _make_async(fs_map.fs)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py", line 56, in _make_async\n    return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})\n           ~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py", line 128, in __call__\n    obj = super().__call__(*args, **kwargs, **strip_tokenize_options)\n  File "/home/runner/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py", line 785, in __init__\n    raise ValueError(\n    ...<2 lines>...\n    )\n'

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[5], line 1
----> 1 catalog_computed = dask.compute(tasks)

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/dask/base.py:769, in compute(traverse, optimize_graph, scheduler, get, *args, **kwargs)
    766     expr = expr.optimize()
    767     keys = list(flatten(expr.__dask_keys__()))
--> 769     results = schedule(expr, keys, **kwargs)
    771 return repack(results)

Cell In[3], line 10
---> 10     return xr.open_dataset(
     11         fs.get_mapper(),
     12         engine="zarr",
     13         backend_kwargs={"consolidated": False},

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/api.py:613, in open_dataset()
    601 decoders = _resolve_decoders_kwargs(
    602     decode_cf,
    603     open_backend_dataset_parameters=backend.open_dataset_parameters,
   (...)    609     decode_coords=decode_coords,
    610 )
    612 overwrite_encoded_chunks = kwargs.pop("overwrite_encoded_chunks", None)
--> 613 backend_ds = backend.open_dataset(
    614     filename_or_obj,
    615     drop_variables=drop_variables,
    616     **decoders,
    617     **kwargs,
    618 )
    619 ds = _dataset_from_backend_dataset(
    620     backend_ds,
    621     filename_or_obj,
   (...)    632     **kwargs,
    633 )
    634 return ds

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py:1741, in open_dataset()
   1739 filename_or_obj = _normalize_path(filename_or_obj)
   1740 if not store:
-> 1741     store = ZarrStore.open_group(
   1742         filename_or_obj,
   1743         group=group,
   1744         mode=mode,
   1745         synchronizer=synchronizer,
   1746         consolidated=consolidated,
   1747         consolidate_on_close=False,
   1748         chunk_store=chunk_store,
   1749         storage_options=storage_options,
   1750         zarr_version=zarr_version,
   1751         use_zarr_fill_value_as_mask=None,
   1752         zarr_format=zarr_format,
   1753         cache_members=cache_members,
   1754     )
   1756 store_entrypoint = StoreBackendEntrypoint()
   1757 with close_on_error(store):

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py:771, in open_group()
    745 @classmethod
    746 def open_group(
    747     cls,
   (...)    764     cache_members: bool = True,
    765 ):
    766     (
    767         zarr_group,
    768         consolidate_on_close,
    769         close_store_on_close,
    770         use_zarr_fill_value_as_mask,
--> 771     ) = _get_open_params(
    772         store=store,
    773         mode=mode,
    774         synchronizer=synchronizer,
    775         group=group,
    776         consolidated=consolidated,
    777         consolidate_on_close=consolidate_on_close,
    778         chunk_store=chunk_store,
    779         storage_options=storage_options,
    780         zarr_version=zarr_version,
    781         use_zarr_fill_value_as_mask=use_zarr_fill_value_as_mask,
    782         zarr_format=zarr_format,
    783     )
    785     return cls(
    786         zarr_group,
    787         mode,
   (...)    796         cache_members=cache_members,
    797     )

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/xarray/backends/zarr.py:1983, in _get_open_params()
   1979     if _zarr_v3():
   1980         # we have determined that we don't want to use consolidated metadata
   1981         # so we set that to False to avoid trying to read it
   1982         open_kwargs["use_consolidated"] = False
-> 1983     zarr_group = zarr.open_group(store, **open_kwargs)
   1985 close_store_on_close = zarr_group.store is not store
   1987 # we use this to determine how to handle fill_value

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/synchronous.py:552, in open_group()
    482 def open_group(
    483     store: StoreLike | None = None,
    484     *,
   (...)    494     use_consolidated: bool | str | None = None,
    495 ) -> Group:
    496     """Open a group using file-mode-like semantics.
    497 
    498     Parameters
   (...)    549         The new group.
    550     """
    551     return Group(
--> 552         sync(
    553             async_api.open_group(
    554                 store=store,
    555                 mode=mode,
    556                 cache_attrs=cache_attrs,
    557                 synchronizer=synchronizer,
    558                 path=path,
    559                 chunk_store=chunk_store,
    560                 storage_options=storage_options,
    561                 zarr_format=zarr_format,
    562                 meta_array=meta_array,
    563                 attributes=attributes,
    564                 use_consolidated=use_consolidated,
    565             )
    566         )
    567     )

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py:156, in sync()
    153 return_result = next(iter(finished)).result()
    155 if isinstance(return_result, BaseException):
--> 156     raise return_result
    157 else:
    158     return return_result

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/core/sync.py:116, in _runner()
    111 """
    112 Await a coroutine and return the result of running it. If awaiting the coroutine raises an
    113 exception, the exception will be returned.
    114 """
    115 try:
--> 116     return await coro
    117 except Exception as ex:  # noqa: BLE001 -- the caller re-raises the returned exception
    118     return ex

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/api/asynchronous.py:859, in open_group()
    794 """Open a group using file-mode-like semantics.
    795 
    796 Parameters
   (...)    847     The new group.
    848 """
    850 _warn_unimplemented_kwargs(
    851     {
    852         "cache_attrs": cache_attrs,
   (...)    856     }
    857 )
--> 859 store_path = await make_store_path(store, mode=mode, storage_options=storage_options, path=path)
    860 if attributes is None:
    861     attributes = {}

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py:482, in make_store_path()
    477     raise ValueError(
    478         "'path' was provided but is not used for FSMap store_like objects. Specify the path when creating the FSMap instance instead."
    479     )
    481 else:
--> 482     store = await make_store(store_like, mode=mode, storage_options=storage_options)
    483     return await StorePath.open(store, path=path_normalized, mode=mode)

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_common.py:414, in make_store()
    409         return FsspecStore.from_url(
    410             store_like, storage_options=storage_options, read_only=_read_only
    411         )
    413 elif _has_fsspec and isinstance(store_like, FSMap):
--> 414     return FsspecStore.from_mapper(store_like, read_only=_read_only)
    416 else:
    417     raise TypeError(f"Unsupported type for store_like: '{type(store_like).__name__}'")

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py:209, in from_mapper()
    185 @classmethod
    186 def from_mapper(
    187     cls,
   (...)    190     allowed_exceptions: tuple[type[Exception], ...] = ALLOWED_EXCEPTIONS,
    191 ) -> FsspecStore:
    192     """
    193     Create an FsspecStore from an FSMap object.
    194 
   (...)    207     FsspecStore
    208     """
--> 209     fs = _make_async(fs_map.fs)
    210     return cls(
    211         fs=fs,
    212         path=fs_map.root,
    213         read_only=read_only,
    214         allowed_exceptions=allowed_exceptions,
    215     )

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/zarr/storage/_fsspec.py:56, in _make_async()
     51     return fs
     52 if fs.async_impl:
     53     # Convert sync instance of an async fs to an async instance. Reuse the original
     54     # constructor arguments rather than round-tripping through JSON, since storage
     55     # options may hold objects that are not JSON-serializable (e.g. credentials).
---> 56     return type(fs)(*fs.storage_args, **{**fs.storage_options, "asynchronous": True})
     58 if fsspec_version < parse_version("2024.12.0"):
     59     raise ImportError(
     60         f"The filesystem '{fs}' is synchronous, and the required "
     61         "AsyncFileSystemWrapper is not available. Upgrade fsspec to version "
     62         "2024.12.0 or later to enable this functionality."
     63     )

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/spec.py:128, in __call__()
    125         if inst is not None:
    126             return inst
--> 128 obj = super().__call__(*args, **kwargs, **strip_tokenize_options)
    129 # Setting _fs_token here causes some static linters to complain.
    130 obj._fs_token_ = token

File ~/micromamba/envs/kerchunk-cookbook/lib/python3.14/site-packages/fsspec/implementations/reference.py:785, in __init__()
    783     self.fss[k] = AsyncFileSystemWrapper(f, asynchronous=self.asynchronous)
    784 elif self.asynchronous ^ f.asynchronous:
--> 785     raise ValueError(
    786         "Reference-FS's target filesystem must have same value "
    787         "of asynchronous"
    788     )

ValueError: Reference-FS's target filesystem must have same value of asynchronous

Build an Xarray-Datatree from the dictionary of datasets

Accessing the Datatree

A Datatree is a collection of related Xarray datasets. We can access individual datasets using UNIX syntax. In the cell below, we will access a single dataset from the datatree.

Convert a Datatree node to a Dataset

Operations across a Datatree

A Datatree contains a collection of datasets with related coordinates and variables. Using some in-built methods, we can analyze it as if it were a single dataset. Instead of looping through hundreds of Xarray datasets, we can apply operations across the Datatree. In the example below, we will lazily create a time-series.

Visualize a single dataset with HvPlot

Shut down the Dask cluster