Delta-tabellen comprimeren

Delta-tabelbestanden worden na verloop van tijd gefragmenteerd. Fragmentatie verhoogt de overhead van bestandsbewerkingen, vermindert de efficiëntie van compressie en kan parallelle uitvoering van lezers beperken. Met compressie worden veel kleine bestanden herschreven in minder bestanden met de juiste grootte, zodat Spark gegevens efficiënter kan lezen en verwerken.

De OPTIMIZE opdracht is de primaire compressiebewerking. Het groepeert kleine bestanden in clusters die gericht zijn op een ideale bestandsgrootte en herschrijft ze vervolgens op opslag.

Zie Tafelonderhoud en optimalisatie voor meerdere werkbelastingen voor compactiestrategieën in SQL Analytics Endpoint, Power BI Direct Lake en Spark.

Compressiemethoden

Microsoft Fabric biedt verschillende benaderingen voor het onderhouden van optimale bestandsgrootten in Delta-tabellen:

OPTIMIZE opdracht

De OPTIMIZE opdracht is de basisbewerking voor het comprimeren van Delta-tabellen. Het herschrijft kleine bestanden in grotere bestanden om de gegevensindeling in Delta-tabellen te verbeteren.

OPTIMIZE dbo.table_name
Vastgoed Description Standaardwaarde Sessieconfiguratie
minFileSize Bestanden die kleiner zijn dan deze drempelwaarde, worden gegroepeerd en herschreven als grotere bestanden. 1073741824 (1 GB) spark.databricks.delta.optimize.minFileSize
maxFileSize Doelbestandsgrootte geproduceerd door de OPTIMIZE opdracht. 1073741824 (1 GB) spark.databricks.delta.optimize.maxFileSize

OPTIMIZE is idempotent, maar een te grote minFileSize kan de schrijfversterking verhogen. Als minFileSize dit bijvoorbeeld is ingesteld op 1 GB, kan een bestand van 900 MB opnieuw worden geschreven na een kleine extra schrijfbewerking. Zie adaptieve doelbestandsgrootte voor richtlijnen voor automatisch beheer van bestandsgrootten.

OPTIMIZE met Z-Order

Wanneer u de ZORDER BY component gebruikt, OPTIMIZE worden actieve bestanden herschreven, zodat rijen met vergelijkbare waarden in dezelfde bestanden worden opgenomen. De gecolokaliseerde lay-out verbetert het overslaan van bestanden bij selectieve filters. Gebruik Z-Order wanneer:

  • Uw queries gebruiken vaak als filter twee of meer velden samen (bijvoorbeeld datum + customer_ID) en
  • Deze predicaten zijn selectief genoeg dat het overslaan op bestandsniveau het aantal gescande bestanden vermindert.
OPTIMIZE dbo.table_name ZORDER BY (column1, column2)

OPTIMIZE met V-Order

De VORDER component resulteert in het bestandenbereik voor compressie, waarbij de V-Order-optimalisatie is toegepast. Zie de gedetailleerde documentatie voor meer informatie over V-Order.

OPTIMIZE dbo.table_name VORDER

U kunt Z-Order en V-Order combineren in één opdracht. Spark past de bewerkingen in deze volgorde toe: bin compaction → Z-Order → V-Order.

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

Het gedrag van V-Order tijdens OPTIMIZE hangt af van de manier waarop u de opdracht aanroept:

Aanroep Gedrag
OPTIMIZE table VORDER Past V-Order toe op herschreven bestanden, ongeacht de instellingen voor de sessie of de tabel.
OPTIMIZE table (geen VORDER trefwoord) Neemt het gedrag van de V-order over van TBLPROPERTIES("delta.parquet.vorder.enabled") indien ingesteld, anders valt u terug op de sessieconfiguratie spark.sql.parquet.vorder.default.

OPTIMIZE met vloeibare clustering

Liquid clustering wordt opgegeven als een tabeloptie; zie Liquid Clustering inschakelen voor meer informatie. Wanneer vloeistofclustering is ingeschakeld, voert OPTIMIZE de fysieke herschrijving uit die het clusteringbeleid toepast.

Belangrijk

Gegevens worden alleen geclusterd wanneer OPTIMIZE wordt uitgevoerd op tabellen met ingeschakelde liquid clustering. Normale schrijfbewerkingen clusteren de gegevens NIET. Het gebruik van een compressiestrategie, zoals het gebruik van automatische compressie of het handmatig plannen van geoptimaliseerde taken, is essentieel om ervoor te zorgen dat de voordelen van geclusterde gegevens (dat wil gezegd, verbeterde overslaan van Delta-bestanden) kunnen worden gerealiseerd.

Snel optimaliseren

Met snelle optimalisatie worden Delta-tabelbestanden snel geanalyseerd en worden compressiebewerkingen overgeslagen die de prestaties waarschijnlijk niet zinvol zullen verbeteren.

In plaats van zonder nadenken bestanden comprimeren wanneer er kleine bestanden zijn, evalueert snelle optimalisatie of elke kandidaat-bin (groep van kleine bestanden) voldoet aan configureerbare best practice-compactiedoelen. Met Fast Optimize wordt alleen compressie uitgevoerd op een bin met bestanden als het samenvoegen ervan waarschijnlijk uw minimale doelgrootte bereikt of als er te veel kleine bestanden zijn. Anders slaat het die groep over of verlaagt het het aantal bestanden dat wordt samengevoegd.

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

Snelle optimalisatie kan worden afgestemd op basis van uw verdichtingsverwachtingen:

Vastgoed Description Standaardwaarde Sessieconfiguratie
minNumFiles Het aantal kleine bestanden dat in een bin moet bestaan om optimalisatie uit te voeren als de bin niet voldoende gegevens bevat die naar schatting een gecomprimeerd bestand opleveren. 50 spark.microsoft.delta.optimize.fast.minNumFiles
parquetCoefficient Vermenigvuldigd met de minimale bestandsgrootte die nodig is voor de optimalisatiecontext om de minimale hoeveelheid kleine bestandsgegevens te bepalen die in een bin moeten bestaan, zodat de bin kan worden opgenomen in het bereik van compactie. 1.3 spark.microsoft.delta.optimize.fast.parquetCoefficient

Opmerking

De parquetCoefficient leidt tot een doelgrootte van een bin die groter is dan de minimale doelbestandsgrootte binnen de geoptimaliseerde context. Deze coëfficiënt is verantwoordelijk voor de realiteit dat het combineren van meerdere kleine Parquet-bestanden resulteert in betere compressie en dus minder gegevens dan de som van kleine bestanden. Verhoog de waarde om de snelle optimalisatie conservatiever te maken in hoe vaak bins worden overgeslagen, of verlaag de waarde om het overslaan van bins meer toe te staan.

Hoe het werkt

Snelle optimalisatie introduceert extra controles voordat containers worden gecomprimeerd. Voor elke kandidaat-bin evalueert fast optimize:

  • De geschatte hoeveelheid onbewerkte gegevens in de bin (som van kleine bestandsgrootten)
  • Of het combineren van de kleine bestanden naar schatting een bestand produceert dat voldoet aan de geconfigureerde minimale doelgrootte
  • Of de bin ten minste het geconfigureerde minimum aantal kleine bestanden bevat

Snelle optimalisatie evalueert elke bin met kleine bestanden en voegt alleen de bins samen die waarschijnlijk de minimale doelgrootte bereiken of het minimale aantal bestanden overschrijden. Bins die niet voldoen aan deze drempelwaarden, worden overgeslagen of gedeeltelijk gecomprimeerd. Het overslaan van suboptimale bins vermindert onnodige herschrijven, verlaagt schrijfversterking en maakt OPTIMIZE-taken idempotent.

Schermopname die laat zien hoe snel optimaliseren evalueert of een bin is gecomprimeerd.

Opmerking

De exacte implementatie is in de loop van de tijd onderhevig aan ontwikkeling.

Met een snelle optimalisatie kunt u de herschreven gegevens verminderen gedurende de levenscyclus van een Delta-tabel. Zoals in het volgende diagram wordt weergegeven, slaat snel optimaliseren suboptimale bakken over, wat resulteert in snellere en idempotente OPTIMIZE taken met minder write amplification.

Schermopname die laat zien hoe snel optimaliseren resulteert in minder herschrijven van gegevens in de loop van de tijd.

Opmerking

Dit is alleen ter illustratie, in de bovenstaande diagrammen wordt verondersteld dat de grootte van het bestand dat is geschreven vanuit compactie, de som is van de grootte van kleine bestanden. Het impliceert ook een parquetCoefficient van 1.

Beperkingen
  • Niet van toepassing op liquide clustering en Z-Order-bewerkingen
  • Met snelle optimalisatie wordt het gedrag van automatische compressie niet gewijzigd

Compressiedoelen op bestandsniveau

Om te voorkomen dat gegevens die eerder zijn gecomprimeerd (groot genoeg) worden herschreven op basis van het wijzigen van compressieminus- en maximale bestandsgroottedoelen, spark.microsoft.delta.optimize.fileLevelTarget.enabled kunnen worden ingeschakeld om recompaction van al gecomprimeerde bestanden te voorkomen. Wanneer deze functie is ingeschakeld, worden bestanden niet opnieuw gecompacteerd als ze eerder ten minste de helft van de doelbestandsgrootte op het moment van compressie hebben bereikt. Het onderhouden van doelen op bestandsniveau minimaliseert schrijfversterking wanneer de compressiedoelgrootte in de loop van de tijd verandert (bijvoorbeeld van de evaluatie van de adaptieve doelbestandsgrootte en het instellen van een groter doel). Indien ingeschakeld, wordt de OPTIMIZE_TARGET_SIZE tag toegevoegd aan nieuwe bestanden wanneer OPTIMIZE wordt uitgevoerd of voor een schrijfbewerking als de delta.targetFileSize eigenschap of delta.targetFileSize.adaptive tabeleigenschap is ingesteld.

Opmerking

Hoewel deze functie niet standaard is ingeschakeld, raadt Microsoft aan om compressiedoelen op bestandsniveau in te schakelen om mogelijke schrijfversterking te beperken.

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

Automatische compressie

Automatische compressie evalueert de partitiestatus na elke schrijfbewerking. Wanneer overmatige bestandsfragmentatie (te veel kleine bestanden) binnen een partitie wordt gedetecteerd, wordt er een synchrone OPTIMIZE bewerking geactiveerd direct nadat de schrijfbewerking is doorgevoerd. Deze schrijfgestuurde benadering van bestandsonderhoud is optimaal omdat compressie alleen wordt uitgevoerd wanneer programmatisch wordt bepaald dat het nuttig is.

Inschakelen op sessieniveau

Instellen spark.databricks.delta.autoCompact.enabled op sessieniveau om automatische compressie in te schakelen voor nieuwe tabellen die in die Spark-sessie zijn gemaakt:

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

Inschakelen op tabelniveau

Stel de tabeleigenschap delta.autoOptimize.autoCompact in om automatische compressie in te schakelen voor specifieke tabellen:

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

Gebruik de optie delta.autoOptimize.autoCompact DataFrameWriter om automatisch comprimeren in te schakelen bij het maken van een tabel:

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

Schakel dezelfde tabeleigenschap in voor een bestaande tabel:

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

Evaluatieoverhead verminderen

Vanaf Fabric Spark Runtime 2.0 (Delta 4.1) kunt u de modus onCheckpointOnly automatisch comprimeren inschakelen. Standaard evalueert automatische compressie bestandsmetagegevens na elke schrijfbewerking om te bepalen of een tabel te veel kleine bestanden heeft. Met onCheckpointOnly wordt de evaluatie uitgesteld tot bewerkingen voor logcontrolepunten (doorgaans elke 10 commits). Op het moment van controlepunt is de momentopname van de tabel al volledig gereconstrueerd, dus de evaluatie leest uit metagegevens die al in het geheugen aanwezig zijn in plaats van dat er een extra scan nodig is. De uitgestelde evaluatie vermindert de overhead per commit, terwijl er nog steeds voor wordt gezorgd dat tabellen periodiek worden gecompacteerd.

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