Komprimace tabulek Delta

Soubory tabulek Delta se časem fragmentují. Fragmentace zvyšuje režijní náklady na operace souborů, snižuje efektivitu komprese a může omezovat paralelismus čtenáře. Komprimace přepíše mnoho malých souborů do méně souborů s správnou velikostí, aby Spark mohl číst a zpracovávat data efektivněji.

Příkaz OPTIMIZE je primární operace komprimace. Seskupí malé soubory do přihrádek, které cílí na ideální velikost souboru, a následně je zapíše do úložiště.

Pro návod pro strategie kompaktace napříč různými zátěžemi napříč SQL analytickými endpointy, Power BI Direct Lake a Spark viz Údržba a optimalizace tabulky napříč pracovními zátěžemi.

Metody komprimace

Fabric nabízí několik přístupů k udržení optimální velikosti souborů v tabulkách Delta:

Příkaz OPTIMIZE

Příkaz OPTIMIZE je základní operací pro komprimaci tabulek Delta. Přepíše malé soubory do větších souborů, aby se zlepšilo rozložení dat v tabulkách Delta.

OPTIMIZE dbo.table_name
Vlastnictví Description Výchozí hodnota Konfigurace relace
minFileSize Soubory, které jsou menší než tato prahová hodnota, se seskupí dohromady a přepíšou se jako větší soubory. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Cílová velikost souboru vytvořená příkazem OPTIMIZE . 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE je idempotentní, ale nadměrný minFileSize může zvýšit zápisovou amplifikaci. Například s nastaveným minFileSize na 1 GB může být soubor 900 MB přepsaný po malém dodatečném zápisu. Pokyny pro automatickou správu velikostí souborů najdete v tématu Adaptivní cílová velikost souboru.

OPTIMIZE s pořadím Z

Když použijete ZORDER BY klauzuli, OPTIMIZE přepíše aktivní soubory tak, aby řádky s podobnými hodnotami byly uloženy ve stejných souborech. Kolokované rozvržení umožňuje efektivnější přeskakování souborů při použití selektivních filtrů. Použití pořadí Z v případech:

  • Vaše dotazy často filtrují dva nebo více sloupců dohromady (například datum + customer_id) a
  • Tyto predikáty jsou dostatečně selektivní, aby přeskočení na úrovni souboru snížilo počet naskenovaných souborů.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE s řádem V

Tato klauzule VORDER vede k tomu, že soubory určené pro kompaktaci mají aplikovanou optimalizaci V-pořadí. Pro více informací o V-order viz podrobná dokumentace.

OPTIMIZE dbo.table_name VORDER

Lze kombinovat Z-Order a V-Order v jednom příkazu. Spark provádí operace v tomto pořadí: zhutnění v zásobníku → Z-řádu → V-řádu.

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

V-pořadí chování během času OPTIMIZE závisí na tom, jak příkaz vyvoláte:

Vyvolání Behavior
OPTIMIZE table VORDER Nutí V-order u přepsaných souborů bez ohledu na nastavení relace nebo tabulky.
OPTIMIZE table (bez VORDER klíčového slova) Dědí V-pořadí chování z pokud TBLPROPERTIES("delta.parquet.vorder.enabled") je nastaveno, jinak se vrací ke konfiguraci spark.sql.parquet.vorder.defaultrelace .

OPTIMIZE s kapalinovým shlukováním

Liquid clustering je specifikováno jako možnost tabulky; viz povolení liquid clusteringu pro podrobnosti. Pokud je povolený liquid clustering, OPTIMIZE provede fyzické přepsání, které použije zásady seskupování.

Důležité

Data jsou clusterovaná pouze tehdy, když OPTIMIZE je spuštěno na tabulkách, které mají povolené clusterování. Běžné operace zápisu neshlukují data. Strategie komprimace, jako je použití automatického komprimace nebo ruční plánování úloh optimalizace, je velmi důležitá, aby se zajistily výhody clusterovaných dat (tj. vylepšené přeskočení souborů Delta).

OPTIMIZE FULL

Standard OPTIMIZE nepřeskupuje soubory, které jsou už považovány za shlukované. Když změníte klíče clusterování nebo poskytovatele clusteringu, stávající soubory si ponechají své původní uspořádání clusteringu, takže nové dotazy nemají prospěch z aktualizované strategie.

OPTIMIZE FULL vynucuje úplné opětovné shlukování celé tabulky. Znovu shlukuje každý soubor – včetně souborů, které byly dříve seskupeny s jinými klíči nebo poskytovatelem – takže celá tabulka odráží nejnovější strategii shlukování.

Poznámka:

OPTIMIZE FULLje dostupný od běhu Fabric Spark 2.0 (Delta 4.2).

Použijte OPTIMIZE FULL, když:

  • Změňte shlukovací sloupce na tabulce s kapalnými shluky.
  • Migrujte tabulku mezi platformami nebo poskytovateli clusteringu.
OPTIMIZE dbo.table_name FULL

Protože OPTIMIZE FULL dokáže přepsat většinu nebo celou velkou tabulku, může být výrazně dražší než běžná inkrementální OPTIMIZE. Spusťte ho záměrně, obvykle jednou po změně strategie shlukování, ne jako součást rutinní údržby.

Rychlá optimalizace

Rychlá optimalizace inteligentně analyzuje soubory tabulek Delta a přeskočí operace komprimace, které pravděpodobně nezlepší výkon smysluplně.

Místo bezhlavého komprimování souborů, kdykoli existují malé soubory, rychlá optimalizace vyhodnotí, zda každá kandidátní skupina (skupina malých souborů) splňuje konfigurované cíle optimalizace podle osvědčených postupů. Funkce Fast Optimize spouští komprimaci pouze na skupině souborů, pokud jejich sloučení dosáhne minimální cílové velikosti, nebo pokud je tam příliš mnoho malých souborů. V opačném případě tuto skupinu přeskočí nebo sníží počet souborů, které komprimuje.

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

Rychlá optimalizace se dá vyladit na základě vašich očekávání komprimace:

Vlastnictví Description Výchozí hodnota Konfigurace relace
minNumFiles Počet malých souborů, které musí existovat ve schránce, aby bylo možné provést optimalizaci, pokud schránka neobsahuje dostatek dat odhadovaných k vytvoření komprimovaného souboru. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Vynásobením minimální velikosti souboru optimalizace určí minimální množství dat malých souborů, které musí být v koši, aby byl tento koš zahrnut do rozsahu komprimace. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Poznámka:

Výsledek parquetCoefficient je, že cílová velikost segmentu je větší než minimální požadovaná velikost souboru v kontextu optimalizace. Tento koeficient zohledňuje skutečnost, že kombinace více malých parquet souborů vede k lepší kompresi, a tedy k menšímu množství dat než součet malých souborů. Zvyšte hodnotu, aby byla konzervativnější v tom, jak často se při optimalizaci přeskakují intervaly, nebo snižte hodnotu, aby se umožnilo přeskočení více přihrádek.

Jak to funguje

Rychlá optimalizace zavádí další kontroly před zhutněním zásobníků. Pro každou kandidátní přihrádku rychlá optimalizace vyhodnocuje:

  • Odhadované množství surových dat v koši (součet malé velikosti souborů)
  • Určuje, jestli se při kombinování malých souborů odhaduje vytvoření souboru, který splňuje nakonfigurovanou minimální cílovou velikost.
  • Jestli koš obsahuje alespoň konfigurovaný minimální počet malých souborů

Fast optimize vyhodnocuje každý bin malých souborů a slučuje pouze ty biny, u nichž je pravděpodobné, že dosáhnou minimální cílové velikosti nebo překročí minimální počet souborů. Koše, které nesplňují tyto prahové hodnoty, se přeskočí nebo částečně zkompaktují. Vynechání neoptimálních intervalů omezuje nepotřebné přepisy, redukuje amplifikaci zápisu a činí úlohy OPTIMIZE více idempotentními.

Snímek obrazovky ukazuje, jak rychle funkce optimalizace vyhodnocuje komprimaci koše.

Poznámka:

Přesná implementace se v průběhu času vyvíjí.

Rychlá optimalizace může snížit přepsaná data v průběhu životního cyklu tabulky Delta. Jak je znázorněno v následujícím diagramu, rychlá optimalizace přeskočí neoptimální koše, což vede k rychlejším a idempotentnějším OPTIMIZE úlohám s menším zesílením zápisu.

Snímek obrazovky znázorňující, jak rychlá optimalizace vede k menšímu přepsání dat v průběhu času

Poznámka:

Pro ilustraci pouze výše uvedené diagramy předpokládají, že velikost souboru zapsaného z komprimace je součet velikosti malých souborů. To také znamená hodnotu parquetCoefficient rovnou 1.

Omezení
  • Nevztahuje se na shlukování kapalin a operace Z-Order.
  • Rychlá optimalizace nemění chování automatického komprimace.

Cíle komprimace na úrovni souborů

Chcete-li zabránit přepsání dat, která byla dříve považována za komprimovaná (dostatečně velká) na základě změny minimálních a maximálních cílů komprimace souborů, spark.microsoft.delta.optimize.fileLevelTarget.enabled je možné povolit, aby se zabránilo rekompakci již komprimovaných souborů. Pokud je tato možnost povolená, soubory se nekompaktují, pokud v době komprimace splňovaly alespoň polovinu cílové velikosti souboru. Udržování cílů na úrovni souboru minimalizuje zapisovací zesílení, protože se mění cílová velikost komprimace v průběhu času (například z vyhodnocení a nastavení větší cílové velikosti souboru). Pokud je tato možnost povolena, je značka OPTIMIZE_TARGET_SIZE přidána do nových souborů při spuštění OPTIMIZE nebo při jakékoli operaci zápisu, pokud je nastavena vlastnost tabulky delta.targetFileSize nebo delta.targetFileSize.adaptive.

Poznámka:

I když není ve výchozím nastavení povolená, společnost Microsoft doporučuje povolit cíle komprimace na úrovni souboru , aby se omezila potenciální amplifikace zápisu.

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

Automatické komprimace

Automatické komprimace vyhodnotí stav oddílu po každé operaci zápisu. Když zjistí nadměrnou fragmentaci souborů (příliš mnoho malých souborů) v rámci oddílu, aktivuje synchronní OPTIMIZE operaci okamžitě po potvrzení zápisu. Tento přístup řízený autorem k údržbě souborů je optimální, protože komprimace se spustí pouze tehdy, když je programově určeno, že je prospěšné.

Povolit na úrovni relace

Nastavte spark.databricks.delta.autoCompact.enabled na úrovni relace a povolte automatické komprimace pro nové tabulky vytvořené v této relaci Sparku:

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

Povolit na úrovni tabulky

Nastavte vlastnost delta.autoOptimize.autoCompact tabulky tak, aby povolte automatické komprimace pro konkrétní tabulky:

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

Pomocí možnosti delta.autoOptimize.autoCompact DataFrameWriter povolte automatické komprimace při vytváření tabulky:

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

U existující tabulky povolte stejnou vlastnost tabulky:

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

Snížit režii vyhodnocování

Počínaje verzí Fabric Spark runtime 2.0 (Delta 4.1) můžete povolit režim onCheckpointOnly automatické kompakce. Ve výchozím nastavení automatické komprimace vyhodnocuje metadata souboru po každé operaci zápisu, aby bylo možné určit, jestli tabulka obsahuje příliš mnoho malých souborů. S onCheckpointOnly se vyhodnocení odkládá na operace vytváření kontrolních bodů protokolu (obvykle po každých 10 potvrzeních transakcí). V době kontrolního bodu je snímek tabulky již plně rekonstruován, takže vyhodnocení čte z metadat, která už jsou v paměti, a nevyžadují další kontrolu. Odložené vyhodnocování snižuje režii při každém commitu a zároveň zajišťuje, že tabulky jsou pravidelně kompaktovány.

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