Delta-táblák tömörítése

A Delta-táblafájlok idővel töredezetté válnak. A töredezettség növeli a fájlművelet többletterhelését, csökkenti a tömörítés hatékonyságát, és korlátozhatja az olvasó párhuzamosságát. A tömörítés sok kis fájlt átír kevesebb megfelelő méretű fájlba, hogy a Spark hatékonyabban tudja olvasni és feldolgozni az adatokat.

A OPTIMIZE parancs az elsődleges tömörítési művelet. A kis fájlokat az ideális fájlméretet megcélzó rekeszekbe csoportosítja, majd újraírja őket a tárolóra.

Az SQL Analytics-végpont, a Power BI Direct Lake és a Spark tömörítési stratégiáival kapcsolatos, munkaterhelések közötti útmutatásért lásd: Táblakarbantartás és -optimalizálás munkaterhelések között.

Tömörítési módszerek

A Fabric több megközelítést kínál az optimális fájlméretek fenntartására a Delta táblákban:

OPTIMIZE parancs

A OPTIMIZE parancs a Delta-táblák tömörítésének alapművelete. A deltatáblák adatelrendezésének javítása érdekében a kisebb fájlokat nagyobb fájlokba írja át.

OPTIMIZE dbo.table_name
Ingatlan Description Alapértelmezett érték Munkamenet-konfiguráció
minFileSize Az ennél a küszöbértéknél kisebb fájlok csoportosítva lesznek, és nagyobb fájlokként lesznek újraírva. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize A parancs által OPTIMIZE létrehozott célfájlméret. 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE idempotens, de egy túlméretezett minFileSize növelheti az írási erősítést. Ha például minFileSize 1 GB-ra van állítva, egy 900 MB-os fájl egy kis plusz írás után újraírható. Az automatikus fájlméret-kezelési útmutatásért tekintse meg az adaptív célfájlméretet.

OPTIMIZE a Z-Orderral

Ha a ZORDER BY záradékot használja, a OPTIMIZE átírja az aktív fájlokat úgy, hogy a hasonló értékeket tartalmazó sorok ugyanabban a fájlban kerüljenek elhelyezésre. Az együtt elhelyezett elrendezés javítja a fájlok kihagyását a szelektív szűrők esetén. A Z-Order használata a következő esetekben:

  • A lekérdezések gyakran együtt két vagy több oszlopra szűrnek (például dátum + ügyfél_azonosító), és
  • Ezek a predikátumok elég szelektívek ahhoz, hogy a fájlszintű kihagyás csökkenti a beolvasott fájlok számát.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE V-rendű

Ez a VORDER záradék eredményeként a tömörítésre kijelölt fájlok V-rendű optimalizálást alkalmaznak. További információkért a V-rendről lásd a részletes dokumentációt.

OPTIMIZE dbo.table_name VORDER

Egyesítheted a Z-Order és V-Order egyetlen parancsot. A Spark a következő sorrendben alkalmazza a műveleteket: bin tömörítés → Z-Order → V-order.

OPTIMIZE dbo.table_name ZORDER BY (column1, column2) VORDER

A V-rendű viselkedés a parancs közben OPTIMIZE attól függ, hogyan hívod meg a parancsot:

Könyörgés Magatartás
OPTIMIZE table VORDER V-sorrendet kényszerít az átírt fájlokra, függetlenül a session vagy tábla beállításoktól.
OPTIMIZE table (nincs VORDER kulcsszó) Ha be van állítva, a TBLPROPERTIES("delta.parquet.vorder.enabled") elemről örökli a V-order viselkedést, ellenkező esetben a munkamenet-konfigurációban megadott spark.sql.parquet.vorder.default értékre áll vissza.

OPTIMIZE folyékony fürtözéssel

A folyékony fürtözés táblabeállításként van megadva; további információt a folyékony fürtözés engedélyezését ismertető cikkben talál. Ha a folyékony fürtözés engedélyezve van, OPTIMIZE végrehajtja a fürtkezelési szabályzatot alkalmazó fizikai átírást.

Fontos

Az adatok csak akkor lesznek fürtözve, ha a OPTIMIZE folyékony klaszterezés engedélyezett táblákon fut. A normál írási műveletek NEM csoportosítják az adatokat. Az olyan tömörítési stratégia, mint az automatikus tömörítés vagy az optimalizálási feladatok manuális ütemezése, kritikus fontosságú annak biztosítása érdekében, hogy a fürtözött adatok előnyei (vagyis a továbbfejlesztett Delta-fájlok kihagyása) megvalósíthatók legyenek.

OPTIMIZE FULL

A Standard OPTIMIZE nem reklasterezi azokat fájlokat, amelyek már klaszterezettnek számítanak. Amikor megváltoztatod a klaszterkulcsokat vagy a klaszterszolgáltatót, a meglévő fájlok megtartják korábbi klaszterezésüket, így az új lekérdezések nem profitálnak a frissített stratégiából.

OPTIMIZE FULL kikényszeríti a teljes táblára kiterjedő újraklaszterezési lefutást. Minden fájlt újracsoportozik – beleértve azokat a fájlokat is, amelyeket korábban különböző kulcsokkal vagy szolgáltatóval csoportosítottak –, így az egész tábla tükrözi a legújabb klaszterezési stratégiát.

Megjegyzés:

OPTIMIZE FULL a Fabric Spark-futtatókörnyezet 2.0-s verziójától (Delta 4.2) érhető el.

Használd OPTIMIZE FULL , ha:

  • Változtasd meg a klaszterező oszlopokat egy folyadékcsoportos táblázaton.
  • Migráljon egy táblát platformok vagy klaszterszolgáltatók között.
OPTIMIZE dbo.table_name FULL

Mivel OPTIMIZE FULL egy nagy tábla nagy részét vagy egészét át lehet írni, ez jelentősen drágább lehet, mint egy sima inkrementális OPTIMIZE. Indítsd szándékosan a gépet, általában egyszer a klaszterezési stratégia megváltoztatása után, nem pedig a rutin karbantartás részeként.

Gyors optimalizálás

A gyors optimalizálás intelligensen elemzi a Delta-táblafájlokat, és kihagyja azokat a tömörítési műveleteket, amelyek nem valószínű, hogy jelentősen javítják a teljesítményt.

Ahelyett, hogy vakon tömöríti a fájlokat, amikor kis fájlok léteznek, a gyors optimalizálás kiértékeli, hogy minden egyes jelölt tároló (kis fájlok csoportja) megfelel-e a konfigurálható ajánlott eljárás tömörítési céljainak. A gyors optimalizálási eljárás csak akkor futtat tömörítést egy fájlcsoporton, ha az egyesítés várhatóan eléri a minimális célméretet, vagy ha túl sok kis fájl van. Ellenkező esetben kihagyja a csoportot, vagy csökkenti a tömörített fájlok számát.

SET spark.microsoft.delta.optimize.fast.enabled = TRUE

A gyors optimalizálás a tömörítési elvárásoknak megfelelően finomhangolható:

Ingatlan Description Alapértelmezett érték Munkamenet-konfiguráció
minNumFiles Azon kis fájlok száma, amelyeknek egy tárolóban kell létezniük az optimalizáláshoz, ha a tároló nem tartalmaz elegendő adatot a tömörített fájlok létrehozásához. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Megszorozva az optimalizálási környezet minimális fájlméretével annak meghatározásához, hogy a tárolóban a tömörítés hatókörébe belefoglalandó kis méretű fájladatoknak minimálisnak kell lenniük. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Megjegyzés:

A parquetCoefficient tároló célmérete nagyobb, mint az optimalizált környezet minimális célfájlmérete. Ez az együttható azt a valóságot adja, hogy több kis parquet-fájl kombinálása jobb tömörítést eredményez, így kevesebb adatot, mint a kis fájlok összege. Növelje az értéket, hogy konzervatívabb legyen a gyűjtők kihagyásának gyors optimalizálása során, vagy csökkentse az értéket, hogy megengedőbb legyen a tárolók kihagyása.

Hogyan működik?

A gyors optimalizálás további ellenőrzéseket vezet be a tárolók tömörítése előtt. Az egyes jelölt tárolóknál a gyors optimalizálás a következőket értékeli:

  • A tárolóban lévő nyers adatok becsült mennyisége (kis fájlméretek összege)
  • Azt mutatja, hogy a kis fájlok egyesítése úgy becsülik, hogy egy olyan fájlt eredményez, amely megfelel a beállított minimális célméretnek.
  • Azt jelzi, hogy a tároló legalább a kis méretű fájlok konfigurált minimális számát tartalmazza-e

A Fast optimize kiértékeli a kis fájlok egyes gyűjtőit, és csak azokat tömöríti, amelyek várhatóan elérik a minimális célméretet, vagy meghaladják a minimális fájldarabszámot. Azok a tárolók, amelyek nem felelnek meg ezeknek a küszöbértékeknek, kihagyva vagy részlegesen tömörítve lesznek. A nem optimális tárolók kihagyása csökkenti a szükségtelen átírásokat, csökkenti az íráserősséget, és idempotensebbé teszi az OPTIMIZE-feladatokat.

Képernyőkép arról, hogy az optimalizálás milyen gyorsan kiértékeli, hogy tömörített-e egy tárolót.

Megjegyzés:

A pontos megvalósítás idővel változhat.

A gyors optimalizálás csökkentheti az újraírt adatokat a Delta-táblák életciklusán keresztül. Ahogy az alábbi ábrán is látható, a gyors optimalizálás kihagyja a nem optimális tárolóegységeket, ami gyorsabb és idempotensebb OPTIMIZE feladatokat eredményez kevesebb íráserősítéssel.

Képernyőkép, amely bemutatja, hogy a gyors optimalizálás hogyan eredményez kevesebb adatátírást idővel.

Megjegyzés:

Csak illusztrációs célokra a fenti diagramok feltételezik, hogy a tömörítésből írt fájl mérete a kis fájlok méretének összege. Ez azt is jelenti, hogy parquetCoefficient értéke 1.

Korlátozások
  • Nem alkalmazható folyékony fürtözési és Z-Order-műveletekre
  • A gyors optimalizálás nem módosítja az automatikus tömörítés viselkedését

Fájlszintű tömörítési célok

A korábban tömörítettnek (elég nagynak) tekintett adatok átírásának elkerülése érdekében a tömörítési minimális és a maximális fájlméret-célértékek módosítása alapján engedélyezhető a spark.microsoft.delta.optimize.fileLevelTarget.enabled már tömörített fájlok újrakompaticiójának megakadályozása. Ha engedélyezve van, a fájlok nem lesznek újrakomponálva, ha korábban a tömörítéskor legalább a célfájl méretének felét tették ki. A fájlszintű célok fenntartása minimálisra csökkenti az íráserősítést, mivel a tömörítési cél mérete idővel változik (például az adaptív célfájlméret kiértékelése és egy nagyobb cél beállítása esetén). Ha engedélyezve van, a rendszer hozzáadja a OPTIMIZE_TARGET_SIZE címkét az új fájlokhoz az OPTIMIZE futtatásakor, illetve bármilyen írási művelethez, ha a tábla vagy delta.targetFileSize a delta.targetFileSize.adaptive tulajdonság be van állítva.

Megjegyzés:

Bár alapértelmezés szerint nincs engedélyezve, a Microsoft azt javasolja, hogy engedélyezze a fájlszintű tömörítési célokat a lehetséges íráserősítés korlátozásához.

SET spark.microsoft.delta.optimize.fileLevelTarget.enabled = TRUE

Automatikus tömörítés

Az automatikus tömörítés minden írási művelet után kiértékeli a partíció állapotát. Ha túlzott fájltöredezettséget (túl sok kis fájlt) észlel egy partíción belül, azonnal elindít egy szinkron OPTIMIZE műveletet az írás véglegesítése után. A fájlkarbantartás ezen íróalapú megközelítése optimális, mivel a tömörítés csak akkor fut, ha programozott módon hasznosnak bizonyul.

Engedélyezés munkamenet szintjén

Állítsa be spark.databricks.delta.autoCompact.enabled a munkamenet szintjén, hogy engedélyezze az automatikus tömörítést az adott Spark-munkamenetben létrehozott új táblákhoz:

SET spark.databricks.delta.autoCompact.enabled = TRUE

Engedélyezés táblaszinten

Táblatulajdonság delta.autoOptimize.autoCompact beállítása adott táblák automatikus tömörítésének engedélyezéséhez:

CREATE TABLE dbo.table_name
TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

Tábla létrehozásakor a DataFrameWriter beállítással delta.autoOptimize.autoCompact engedélyezheti az automatikus tömörítést:

df.write.option('delta.autoOptimize.autoCompact', 'true').saveAsTable('dbo.table_name')

Engedélyezze ugyanazt a táblatulajdonságot egy meglévő táblán:

ALTER TABLE dbo.table_name
SET TBLPROPERTIES ('delta.autoOptimize.autoCompact' = 'true')

A kiértékelési többletterhelés csökkentése

A Fabric Spark runtime 2.0-tól (Delta 4.2) kezdve engedélyezheted az onCheckpointOnly automatikus tömörítési módot. Az automatikus tömörítés alapértelmezés szerint minden írási művelet után kiértékeli a fájl metaadatait annak megállapításához, hogy egy tábla túl sok kis fájllal rendelkezik-e. onCheckpointOnly esetén a kiértékelés az ellenőrzőpont-kezelési műveletek naplózásáig halasztódik el (általában 10 commitonként). Az ellenőrzőpont-időpontban a táblázat pillanatképe már teljesen rekonstruálva van, így az értékelés a memóriában lévő metaadatokból olvassa be ahelyett, hogy extra vizsgálatot igényel. A halasztott értékelés csökkenti a véglegesítésenkénti többletterhelést, miközben továbbra is biztosítja a táblák rendszeres tömörítését.

SET spark.microsoft.delta.autoCompact.onCheckpointOnly.enabled = TRUE