Cache manifest and manifest-list bytes by location, as Iceberg Java's `io.manifest.cache-*` does
维护者通常 1 天内回复
评估
调研方向
Start by tracing load_table, plan_files, _manifests, and fetch_manifest_entry to confirm where metadata, manifest-list, and manifest bytes are read. Then review the existing _manifest_cache and the related issues #1187, #3978, and #3991. Done means callers can supply a bounded, location-keyed byte cache for manifests and manifest lists, disabled by default, while parsing remains unchanged.
由索引模型根据 Issue 内容生成。
描述
Feature Request / Improvement
Planning the same table repeatedly reads the same immutable files from object storage every time, and fails while the store is unreachable, even for a snapshot just planned.
Per load_table plus plan_files, pyiceberg 0.12.0 (and main) reads:
metadata.jsonon every load, on non-REST catalogs (REST returns it inline).- The manifest list on every plan.
_manifestsre-reads it on purpose, to avoid the O(N²) memory of caching overlappingManifestFiletuples (#1187). - Each manifest on every plan, via
fetch_manifest_entry._manifest_cachekeeps theManifestFilerecords, not the manifests' contents.
These files are never rewritten, so the bytes at a location never change.
Iceberg Java caches these bytes. ManifestFiles and ManifestLists read through a per-FileIO ContentCache, set by these properties (CatalogProperties):
io.manifest.cache-enabled(defaultfalse)io.manifest.cache.max-total-bytes(default 100 MiB)io.manifest.cache.max-content-length(default 8 MiB)io.manifest.cache.expiration-interval-ms(default 60 s)
Proposal
-
Cache manifest and manifest-list bytes by location, off by default and bounded in bytes, as in Java. Parsing stays as it is.
Caching bytes avoids the problem in #3978 / #3991. A
ManifestFilerecord carries values from the manifest list that names it, so a parsed-object cache keyed by path can serve one reference's values to another. (iceberg-rust addsadded_snapshot_id,sequence_numberandfirst_row_idto its key for this reason.) Bytes are the same for every reference. -
Let the caller supply the cache, e.g.
get(location) -> bytes | Noneandput(location, data), with the in-memory one as the default. A disk cache behind it would survive restarts and keep planning working through a store outage for snapshots already read. iceberg-rust has a similar hook (ObjectCacheProvide) for parsed objects.
metadata.json could use the same cache. For REST, #4075 / #4094 cover it with If-None-Match.
Java configures this with FileIO properties; #2952 used Config and an env var for manifest-cache-size. Either is fine.
Related: #4007 and #3662 make each read cheaper; this removes repeated reads.
What we do today
In Strata (a materialization layer that, among other things, caches Iceberg scans) we set py-io-impl to a FileIO that wraps the one load_file_io would pick. Its new_input serves *.metadata.json and *.avro on remote schemes from a bounded disk cache, keyed by location plus the endpoint properties, and passes everything else through.
Drawbacks:
- It identifies immutable files by suffix.
- It takes over
py-io-impl, so it must carry a user's ownpy-io-implunder another property. - It builds an inner FileIO per scheme, since a FileIO does not know which locations it will serve.
A cache hook at the read points above would remove the need for the wrapper.
- 主要语言
- Python
- 星标
- 1.2k
- 派生
- 654
- 平均合并
- 2 天 11 小时
- 30 天内合并 PR
- 122
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 没有贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
apache/iceberg-python 的其他 Issue
-
`inspect.files()` and the other file metadata tables raise `ArrowInvalid` when a snapshot has no manifests可能已有人在做 @YuangGao 于 10 天前认领。 未关闭kind:bug
难度 2/5 1-3 小时 新手友好度 72/100
apache/iceberg-python#4269 ·
维护者通常 1 天内回复
-
`inspect.entries()` raises TypeError when a data file has no column_sizes可能已有人在做 @Rahul-cs50 于 14 天前认领。 未关闭kind:bug
难度 2/5 1-3 小时 新手友好度 78/100
apache/iceberg-python#4186 · 2 条评论 ·
维护者通常 1 天内回复
-
`older_than` reads a naive datetime as UTC and expires snapshots it should keep可能已有人在做 @Rahul-cs50 于 13 天前认领。 未关闭kind:bug
难度 2/5 1-3 小时 新手友好度 72/100
apache/iceberg-python#4182 · 1 条评论 ·
维护者通常 1 天内回复
-
REST: Send empty first-page pageToken when rest-page-size is set可能已有人在做 @ehddnr301 于 32 天前认领。 未关闭kind:bug
难度 2/5 1-3 小时 新手友好度 82/100
apache/iceberg-python#4096 ·
维护者通常 1 天内回复
-
PyArrowFileIO: every small S3 write is a 3-request multipart upload; expose allow_delayed_open可能已有人在做 @David-Banquet 于 29 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 70/100
apache/iceberg-python#4093 · 3 条评论 ·
维护者通常 1 天内回复
查看 apache/iceberg-python 的全部 Issue
相似的 Issue
-
bug
难度 2/5 1-3 小时 新手友好度 80/100
glossyio/traffic-monitor#312 ·
维护者通常 1 天内回复
-
documentation enhancement
难度 2/5 1-3 小时 新手友好度 76/100
es-ude/elastic-ai.creator#1046 ·
维护者通常 3 天内回复
-
feature request
难度 2/5 1-3 小时 新手友好度 65/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
confident-ai/deepteam#306 ·
维护者通常 1 天内回复
-
SslLibrary crashes with unhandled OSError: port/proto not found on non-standard SSL ports可能已有人在做 @himanchalkaushale 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 82/100
OWASP/Nettacker#1884 · 1 条评论 ·
维护者通常 1 天内回复