Cache manifest and manifest-list bytes by location, as Iceberg Java's `io.manifest.cache-*` does
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 35/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- Python
- Stelle
- 1.2k
- Fork
- 654
- Merge medio
- 2g 11h
- PR unite (30g)
- 122
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Nessuna guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/iceberg-python
-
`inspect.files()` and the other file metadata tables raise `ArrowInvalid` when a snapshot has no manifestsForse già presa @YuangGao l’ha presa 10 giorni fa. Apertakind:bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/iceberg-python#4269 ·
I maintainer di solito rispondono entro 1 giorno
-
`inspect.entries()` raises TypeError when a data file has no column_sizesForse già presa @Rahul-cs50 l’ha presa 14 giorni fa. Apertakind:bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/iceberg-python#4186 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
`older_than` reads a naive datetime as UTC and expires snapshots it should keepForse già presa @Rahul-cs50 l’ha presa 13 giorni fa. Apertakind:bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
apache/iceberg-python#4182 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
REST: Send empty first-page pageToken when rest-page-size is setForse già presa @ehddnr301 l’ha presa 32 giorni fa. Apertakind:bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/iceberg-python#4096 ·
I maintainer di solito rispondono entro 1 giorno
-
PyArrowFileIO: every small S3 write is a 3-request multipart upload; expose allow_delayed_openForse già presa @David-Banquet l’ha presa 29 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
apache/iceberg-python#4093 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/iceberg-python
Issue simili
-
SslLibrary crashes with unhandled OSError: port/proto not found on non-standard SSL portsForse già presa @himanchalkaushale l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
OWASP/Nettacker#1884 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
A-connection-core C-enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
aws-samples/sample-per-model-bedrock#869 ·
I maintainer di solito rispondono entro 1 giorno
-
Spec: say that included_antigen_sources gates LENS labels; do not merge it into antigen kindsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
fzn0x/watchtower#17 ·