Tabeloptimering af Delta Lake og V-Order
Tabelformatet Lakehouse og Delta Lake er centrale for Microsoft Fabric, og det er et vigtigt krav at sikre, at tabeller er optimeret til analyse. Denne vejledning dækker Delta Lake-tabeloptimeringskoncepter, konfigurationer og hvordan den anvendes på de mest almindelige Big Data-forbrugsmønstre.
Hvad er V-Order?
V-Order er en optimering af skrivetid til parquetfilformatet , der muliggør lynhurtige læsninger under Microsoft Fabric-beregningsprogrammer, f.eks. Power BI, SQL, Spark og andre.
Power BI- og SQL-programmer bruger Microsoft Verti-Scan-teknologi og V-ordnede parquetfiler til at opnå hukommelse som f.eks. dataadgangstider. Spark og andre beregningsprogrammer, der ikke er Verti-Scan, drager også fordel af V-Ordnede filer med gennemsnitligt 10 % hurtigere læsetider med nogle scenarier op til 50 %.
V-Order fungerer ved at anvende særlig sortering, distribution af rækkegrupper, kodning og komprimering af ordbog på parketfiler, hvilket kræver færre netværks-, disk- og CPU-ressourcer i beregningsprogrammer for at læse den, hvilket giver omkostningseffektivitet og ydeevne. V-sortering har en indvirkning på gennemsnitlig skrivetid på 15 %, men giver op til 50 % mere komprimering.
Det er 100 % kompatibelt med open source-parketformat. Alle parketprogrammer kan læse det som en almindelig parketfiler. Delta-tabeller er mere effektive end nogensinde før. funktioner som Z-Order er kompatible med V-Order. Tabelegenskaber og optimeringskommandoer kan bruges på V-Order-kontrolelementet på partitionerne.
V-Order anvendes på parquetfilniveau. Delta tabeller og dens funktioner, såsom Z-Order, komprimering, vakuum, tidsrejser, osv. er orthogonal til V-Order, som sådan, er kompatible og kan bruges sammen for ekstra fordele.
Styring af V-order-skrivninger
V-Order er som standard aktiveret i Microsoft Fabric og i Apache Spark styres den af følgende konfigurationer.
Konfiguration | Standardværdi | Beskrivelse |
---|---|---|
spark.sql.parquet.vorder.enabled | true | Styrer skrivning af V-ordre på sessionsniveau. |
TBLPROPERTIES("delta.parquet.vorder.enabled") | false | V-order-standardtilstand for tabeller |
Indstilling for datarammeskriver: parquet.vorder.enabled | unset | Kontrollér V-Order-skrivninger ved hjælp af Dataframe-skriver |
Brug følgende kommandoer til at styre brugen af V-Order-skrivninger.
Kontrollér konfigurationen af V-Order i Apache Spark-sessionen
%%sql
SET spark.sql.parquet.vorder.enabled
Deaktiver V-Order-skrivning i Apache Spark-sessionen
%%sql
SET spark.sql.parquet.vorder.enabled=FALSE
Aktivér V-Order-skrivning i Apache Spark-sessionen
Vigtigt
Når aktiveret på sessionsniveau. Alle parketskrivninger foretages med V-Order aktiveret. Dette omfatter ikke-Delta-parquet-tabeller og Delta-tabeller, hvor tabelegenskaben parquet.vorder.enabled
er angivet til enten true
eller false
.
%%sql
SET spark.sql.parquet.vorder.enabled=TRUE
Kontrollér V-rækkefølge ved hjælp af egenskaber for Delta-tabel
Aktivér egenskaben for tabellen V-Order under oprettelse af tabellen:
%%sql
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
Vigtigt
Når tabelegenskaben er angivet til true, fungerer kommandoerne INSERT, UPDATE og MERGE som forventet og udfører skrivetidsoptimering. Hvis konfigurationen af V-Order-sessionen er angivet til sand, eller hvis spark.write aktiverer den, vil skrivene være V-Order, selvom TBLPROPERTIES er angivet til falsk.
Aktivér eller deaktiver V-order ved at ændre tabelegenskaben:
%%sql
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");
ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");
Når du har aktiveret eller deaktiveret V-Order ved hjælp af tabelegenskaber, er det kun fremtidige skrivninger til tabellen, der påvirkes. Parquetfiler bevarer den rækkefølge, der blev brugt, da den blev oprettet. Hvis du vil ændre den aktuelle fysiske struktur for at anvende eller fjerne V-Order, skal du læse afsnittet "Kontrollér V-rækkefølge, når du optimerer en tabel" nedenfor.
Styring af V-order direkte ved skrivehandlinger
Alle Apache Spark-skrivekommandoer nedarver sessionsindstillingen, hvis de ikke er eksplicitte. Alle følgende kommandoer skriver ved hjælp af V-Order ved implicit at nedarve sessionskonfigurationen.
df_source.write\
.format("delta")\
.mode("append")\
.saveAsTable("myschema.mytable")
DeltaTable.createOrReplace(spark)\
.addColumn("id","INT")\
.addColumn("firstName","STRING")\
.addColumn("middleName","STRING")\
.addColumn("lastName","STRING",comment="surname")\
.addColumn("birthDate","TIMESTAMP")\
.location("Files/people")\
.execute()
df_source.write\
.format("delta")\
.mode("overwrite")\
.option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
.saveAsTable("myschema.mytable")
Vigtigt
V-Order gælder kun for filer, der er påvirket af prædikatet.
I en session, hvor spark.sql.parquet.vorder.enabled
er ikke angivet eller angivet til falsk, skrives følgende kommandoer ved hjælp af V-rækkefølge:
df_source.write\
.format("delta")\
.mode("overwrite")\
.option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-01-31'")\
.option("parquet.vorder.enabled ","true")\
.saveAsTable("myschema.mytable")
DeltaTable.createOrReplace(spark)\
.addColumn("id","INT")\
.addColumn("firstName","STRING")\
.addColumn("middleName","STRING")\
.addColumn("lastName","STRING",comment="surname")\
.addColumn("birthDate","TIMESTAMP")\
.option("parquet.vorder.enabled","true")\
.location("Files/people")\
.execute()
Hvad er Optimer skrivning?
Analytiske arbejdsbelastninger på Big Data-behandlingsprogrammer som Apache Spark fungerer mest effektivt, når du bruger standardiserede større filstørrelser. Relationen mellem filstørrelsen, antallet af filer, antallet af Spark-arbejdere og dens konfigurationer spiller en vigtig rolle for ydeevnen. Indtagelse af data i data lake-tabeller kan have den nedarvede egenskab, at der konstant skrives mange små filer. dette scenarie kaldes ofte for "lille filproblem".
Optimer skrivning er en Delta Lake på Microsoft Fabric- og Azure Synapse Analytics-funktionen i Apache Spark-programmet, der reducerer antallet af filer, der skrives, og som har til formål at øge de skriftlige datas individuelle filstørrelse. Målfilens størrelse kan ændres pr. arbejdsbelastningskrav ved hjælp af konfigurationer.
Funktionen er som standard aktiveret i Microsoft Fabric Runtime til Apache Spark. Du kan få mere at vide om Optimer skriveanvendelsesscenarier i artiklen Behovet for at optimere skrive på Apache Spark.
Fletteoptimering
Kommandoen Delta Lake MERGE giver brugerne mulighed for at opdatere en deltatabel med avancerede betingelser. Det kan opdatere data fra en kildetabel, -visning eller DataFrame til en destinationstabel ved hjælp af kommandoen MERGE. Den aktuelle algoritme i åben kildekode distributionen af Delta Lake er dog ikke fuldt optimeret til håndtering af uændrede rækker. Microsoft Spark Delta-teamet implementerede en brugerdefineret Low Shuffle Merge-optimering. Uændrede rækker er udelukket fra en dyr blandingshandling, der er nødvendig for at opdatere tilsvarende rækker.
Implementeringen styres af spark.microsoft.delta.merge.lowShuffle.enabled
konfigurationen, der som standard er aktiveret i kørselstidspunktet. Den kræver ingen kodeændringer og er fuldt kompatibel med distributionen af Delta Lake med åben kildekode. Hvis du vil vide mere om brugsscenarier for lav shufflefletning, skal du læse artiklen Optimering af lav shufflefletning i Delta-tabeller.
Vedligeholdelse af deltatabel
I takt med at Delta-tabeller ændres, forringes ydeevnen og lageromkostningseffektiviteten af følgende årsager:
- Nye data, der føjes til tabellen, kan forvrænge data.
- Dataindtagelseshastigheder for batch- og streamingdata kan medføre mange små filer.
- Opdaterings- og sletningshandlinger medfører til sidst læseomkostninger. parquet-filer er uforanderlige af design, så Delta-tabeller tilføjer nye parquetfiler med ændringssættet, så de problemer, der pålægges af de første to elementer, forstærkes yderligere.
- Der er ikke længere brug for datafiler og logfiler, der er tilgængelige i lageret.
Hvis du vil bevare tabellerne i den bedste tilstand for at opnå den bedste ydeevne, skal du udføre bin-compaction og støvsugning i Delta-tabellerne. Bin-compaction opnås ved hjælp af kommandoen OPTIMIZE . Den fletter alle ændringer i større, sammenflettede parquetfiler. Lageroprydning, der ikke refereres til, opnås ved hjælp af kommandoen VACUUM .
Kommandoerne OPTIMIZE og VACUUM til tabelvedligeholdelse kan bruges i notesbøger og Spark Job-definitioner og derefter organiseres ved hjælp af platformfunktioner. Lakehouse i Fabric tilbyder en funktionalitet til at bruge brugergrænsefladen til at udføre ad hoc-tabelvedligeholdelse, som forklaret i artiklen Om vedligeholdelse af delta lake-tabeller.
Vigtigt
Det er sandsynligvis vigtigere at designe tabellens fysiske struktur på baggrund af indtagelseshyppigheden og forventede læsemønstre end at køre de optimeringskommandoer, der er beskrevet i dette afsnit.
Styr V-rækkefølge, når du optimerer en tabel
Følgende kommando strukturerer bin-compact og omskriver alle berørte filer ved hjælp af V-Order, uafhængigt af indstillingen TBLPROPERTIES eller sessionskonfigurationsindstillingen:
%%sql
OPTIMIZE <table|fileOrFolderPath> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER BY (col_name1, col_name2, ...)] VORDER;
Når ZORDER og VORDER bruges sammen, udfører Apache Spark bin-compaction, ZORDER, VORDER sekventielt.
Følgende kommandoer bin-compact og omskrive alle berørte filer ved hjælp af indstillingen TBLPROPERTIES. Hvis TBLPROPERTIES er angivet til true til V-Order, skrives alle berørte filer som V-Order. Hvis TBLPROPERTIES ikke er angivet eller angivet til falsk til V-Order, arver den sessionsindstillingen. så hvis du vil fjerne V-Order fra tabellen, skal du angive sessionkonfigurationen til falsk.
%%sql
OPTIMIZE <table|fileOrFolderPath>;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];