Upsert with 1M rows extremely slow due to `create_match_filter` and `txn.delete()` performance
Dieses Issue hat noch niemand ĂŒbernommen.
Bewertung
- Schwierigkeit
- 5/5
- GeschÀtzter Aufwand
- Ăber eine Woche
- AnfÀngerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Muss geklÀrt werden
- AktivitÀtsstatus
- Ruhig
- Tech-Stack
- python
- Bereich
- data-engineering, databases
Rechercherichtung
Beginne mit den im Bericht beschriebenen Einstiegspunkten create_match_filter und txn.delete(), und reproduziere anschlieĂend den Upsert-Benchmark mit 1M Zeilen anhand der bereitgestellten Zeitmessungen. Sieh dir die verwandten Issues #2159, #2138 und #2943 an, um den bestehenden Kontext zu berĂŒcksichtigen. Die Arbeit ist abgeschlossen, wenn entweder eine gemessene Verbesserung oder eine dokumentierte, unterstĂŒtzte Möglichkeit vorliegt, die gemeldeten Kosten des Löschens der gesamten Tabelle zu vermeiden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Apache Iceberg version
0.11.0
Please describe the bug đ
CC @goutamvenkat-anyscale @koenvo @Fokko
Hello! We are implementing distributed writes from Ray Data to Iceberg. As part of upserts, we:
- Write data files in parallel across Ray workers (each worker writes its share of Parquet files directly to storage and returns
DataFilemetadata + the upsert key columns back to the driver) - On the driver, concatenate all upsert keys collected from workers, call
create_match_filterto build a delete predicate, then calltxn.delete()followed by an append to commit
Upserting 1M rows (383 MiB) into an Iceberg table takes ~17.5 minutes, almost entirely in the delete step:
create_match_filter (1M keys â In filter): 10.26s
txn.delete(): 1054.35s
append + commit: 1.14s
âââââââââââââââââââââââââââââââââââââââââââââââââââââ
Total upsert commit: 1065.75s
PyIceberg version 0.11.0
This matches what's reported in #2159 and #2138.
The bottlenecks are:
create_match_filterâ constructs a PythonBooleanExpressionnode per row, which is expensive at 1M+ keystxn.delete()â evaluates the resulting giantInexpression against the table's data files with no partition pruning, effectively doing a full table scan
We have a few questions:
- Merge-on-read upserts â is this on the roadmap, and if so, roughly when? MoR would let us avoid the expensive delete + rewrite cycle entirely for large upserts.
- Optimizing
create_match_filterortxn.delete()â is there a recommended way to speed these up today? For example, batching theInfilter, or passing a partition-level hint to constrain the file scan? - Partition-aware deletes â if the upsert key columns overlap with partition columns, is there a supported way to restrict
txn.delete()to only the relevant partitions, rather than scanning the full table?
Related
- #2159 â Upserting large table extremely slow
- #2138 â Upsertion memory usage grows exponentially as table size grows
- #2943 â Optimize upsert performance for large datasets
Willingness to contribute
- I can contribute a fix for this bug independently
- I would be willing to contribute a fix for this bug with guidance from the Iceberg community
- I cannot contribute a fix for this bug at this time
- Vorherrschende Sprache
- Python
- Sterne
- 1.1k
- Forks
- 589
- Ă Merge
- 2 T. 2 Std.
- Gemergte PRs (30 T.)
- 70
Beitragsleitfaden
FĂŒr dieses Repository ist kein Beitragsleitfaden indexiert
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es ĂŒbernehmen â das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Ăffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus apache/iceberg-python
-
kind:bug
Schwierigkeit 1/5 Unter einer Stunde AnfÀngerfreundlichkeit 92/100
apache/iceberg-python#4006 ·
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 78/100
apache/iceberg-python#3996 ·
-
Deletion vector bitmap count is read from the blob and used as a loop bound without validation Offenbug
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 72/100
apache/iceberg-python#3979 ·
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 78/100
apache/iceberg-python#3885 ·
-
[Bug] PyArrowFileIO fails to propagate s3.ssl.ca-cert to pyarrow.fs.S3FileSystem tls_ca_file_path Offen
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 76/100
apache/iceberg-python#3866 · 1 Kommentar ·
Alle Issues in apache/iceberg-python
Ăhnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 75/100
anthropics/skills#1811 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 75/100
speaches-ai/speaches#678 ·
-
bug
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 75/100
datalayer/mcp-compose#42 ·
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 75/100
conda-forge/spacy-feedstock#177 ·
-
Schwierigkeit 2/5 1-3 Stunden AnfÀngerfreundlichkeit 70/100
UKGovernmentBEIS/inspect_evals#2523 ·