Zpět na domů

Optimalizace Iceberg: řazení a deletion vectors

Článek rozebírá optimalizace tabulek Apache Iceberg: řazení pro data skipping, nastavení statistik podle sloupců a přechod na deletion vectors v3. Uvádějí se kódové příklady pro Spark a metriky efektivity.

Optimalizace Iceberg: od řazení po deletion vectors
Advertisement 728x90

Optimalizace Iceberg tabulek: řazení, statistiky a vektorizované mazání

Řazení dat při zápisu do Iceberg tabulek umožňuje vykonávacím enginům přeskočit nepotřebné soubory na základě min/max statistik v manifest souborech. Bez řazení se rozsahy hodnot v souborech překrývají, což vede ke čtení všech dat i při striktní filtraci.

Příklad vytvoření tabulky a zápisu bez řazení:

spark.sql("""
CREATE TABLE habr.paper.write_ordered (
  id INT,
  name STRING,
  event STRING
)
USING ICEBERG
""")
data = [(i, f"name_{i}", f"event_{i}") for i in range(1, 1000000)]
df = spark.createDataFrame(data, ["id", "name", "event"]).repartition(16)
df.writeTo("habr.paper.write_ordered").append()

Dotaz na metadata ukazuje chaotické rozsahy:

Google AdInline article slot

| id_min | id_max | file_path |

|--------|--------|-----------|

| 2 | 999994 | ... |

Google AdInline article slot

| 43 | 999988 | ... |

Filtr podle id < 100000 přečte všechny soubory.

Aktivace řazení:

Google AdInline article slot
spark.sql("""
ALTER TABLE habr.paper.write_ordered
WRITE ORDERED BY id
""")

Opakovaný zápis dává sekvenční rozsahy:

| id_min | id_max | file_path |

|--------|--------|-----------|

| 1 | 196479 | ... |

| 196480 | 395983 | ... |

Nyní filtr id < 196470 čte pouze jeden soubor.

Nastavení sběru statistik podle sloupců

Iceberg ve výchozím nastavení sbírá úplné min/max/zkrácené statistiky pro všechny sloupce, což zvyšuje čas zápisu bez užitku pro dotazy. V typických tabulkách se filtrace provádí podle 1-2 sloupců, ostatním statistiky nejsou potřeba.

Příklad ploché tabulky s 10 sloupci:

spark.sql("""
CREATE TABLE habr.paper.typical_flat_table (
  id INT,
  name STRING,
  col_1 STRING,
  col_2 STRING,
  col_3 STRING,
  col_4 STRING,
  col_5 STRING,
  col_6 STRING,
  col_7 STRING,
  col_8 STRING
)
USING ICEBERG
""")

Nastavení přes TBLPROPERTIES:

spark.sql("""
ALTER TABLE habr.paper.typical_flat_table SET TBLPROPERTIES (
    'write.metadata.metrics.default' = 'counts',
    'write.metadata.metrics.column.id' = 'full',
    'write.metadata.metrics.column.col_1' = 'none'
)
""")
  • default: 'counts' — pouze počítadla řádků pro všechny sloupce
  • full: min/max + zkrácené pro kritické filtry (id)
  • none: vypnutí pro nepoužívané sloupce

Tím se sníží režie zápisu a objem metadat bez ztráty data skipping podle klíčových polí.

Vektorizované mazání v MoR

Ve strategii Merge-on-Read závisí výkon čtení na mechanismu aplikace mazání. Klasické delete soubory vyžadují join s daty.

Typy delete souborů:

  • Equality delete: pravidla mazání (zastaralé ve v3)
  • Position delete: pozice řádků v souborech

S Iceberg v3 se position delete vyvinuly v Deletion vectors na bázi formátu Puffin. Deletion vector — bitmapová maska, aplikovaná v jednom taktu na data soubor.

Příklad position delete:

| file_path | pos |

|-----------|-----|

| ...parquet | 873 |

| ...parquet | 230 |

Místo joinu: načtení bitmapy + logická operace AND. Toto zrychluje čtení MoR tabulek 5-10x při vysokém % mazání.

Deletion vectors jsou obzvláště účinné pro:

  • Dávkové ETL s častými aktualizacemi
  • Tabulky s slowly changing dimensions
  • Streaming s MoR

Co je důležité

  • Řazení WRITE ORDERED BY podle filtrovatelných sloupců snižuje čtené soubory v analytice
  • Nastavení write.metadata.metrics.* minimalizuje režii zápisu, zachovává data skipping
  • Deletion vectors v Iceberg v3 nahrazují position delete, zrychlují MoR čtení přes bitmapu
  • Optimalizace fungují bez změn dotazů a ETL logiky
  • Efekt se kumuluje: méně souborů, metadat, zátěže na object storage

— Editorial Team

Advertisement 728x90

Číst dál