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時間
- マージ済み PR(30日)
- 122
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドなし
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- 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 日以内に返信
-
local devenv exampleオープン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 日以内に返信