Ottimizzazione della tabella Delta Lake e V-Order
Il formato delle tabelle Lakehouse e Delta Lake è fondamentale per Microsoft Fabric, perché assicurare che tali tabelle siano ottimizzate per l'analisi è un requisito fondamentale. La presente guida illustra i concetti di ottimizzazione e le configurazioni della tabella Delta Lake, oltre alla modalità di applicazione ai modelli di utilizzo Big Data più comuni.
Cos'è V-Order?
V-Order è un'ottimizzazione del tempo di scrittura nel formato di file parquet che consente letture veloci nei motori di calcolo di Microsoft Fabric, tra cio Power BI, SQL, Spark e altri.
I motori Power BI e SQL usano la tecnologia Microsoft Verti-Scan e i file parquet in V-Order per ottenere tempi di accesso ai dati simili a quelli dei dati in memoria. Spark e altri motori di calcolo non Verti-Scan traggono vantaggio anche dai file in V-Order con una media di tempi di lettura più veloce del 10%, con alcuni scenari fino al 50%.
V-Order funziona applicando un ordinamento speciale, una distribuzione di gruppi di righe, una codifica del dizionario e una compressione su file parquet, richiedendo, pertanto, minori risorse di rete, disco e CPU nei motori di calcolo per la lettura e offrendo efficienza dei costi e prestazioni. L'ordinamento V-Order ha un impatto del 15% sui tempi di scrittura medi, ma offre una compressione fino al 50% in più.
È conforme al 100% al formato parquet open source e tutti i motori Parquet possono leggerlo come normali file parquet. Le tabelle Delta sono più efficienti che mai; funzionalità come Z-Order sono compatibili con V-Order. Le proprietà delle tabelle e i comandi di ottimizzazione possono essere usati nel controllo di V-Order nelle relative partizioni.
V-Order viene applicato a livello di file parquet. Le tabelle Delta e le relative caratteristiche, come Z-Order, compattazione, svuotamento, spostamento cronologico e così via, sono ortogonali per V-Order e, in quanto tali, sono compatibili e possono essere usate insieme per vantaggi aggiuntivi.
Controllo delle scritture di V-Order
V-Order è abilitato per impostazione predefinita in Microsoft Fabric e in Apache Spark è controllato dalle configurazioni seguenti.
Impostazione | Default value | Descrizione |
---|---|---|
spark.sql.parquet.vorder.enabled | true | Controlla la scrittura di V-Order a livello di sessione. |
TBLPROPERTIES("delta.parquet.vorder.enabled") | false | Modalità V-Order predefinita nelle tabelle |
Opzione writer del dataframe: parquet.vorder.enabled | Non impostato | Controllare che V-Order scriva usando il writer del dataframe |
Usare i comandi seguenti per controllare l'utilizzo delle scritture di V-Order.
Controllare la configurazione di V-Order nella sessione di Apache Spark
%%sql
SET spark.sql.parquet.vorder.enabled
Disabilitare la scrittura di V-Order nella sessione di Apache Spark
%%sql
SET spark.sql.parquet.vorder.enabled=FALSE
Abilitare la scrittura di V-Order nella sessione di Apache Spark
Importante
Quando abilitata a livello di sessione. Tutte le scritture parquet vengono eseguite con V-Order abilitato. Sono incluse le tabelle parquet non Delta e le tabelle Delta con la parquet.vorder.enabled
proprietà tabella impostata su true
o false
.
%%sql
SET spark.sql.parquet.vorder.enabled=TRUE
Controllare V-Order, usando le proprietà della tabella Delta
Abilitare la proprietà della tabella V-Order durante la creazione della tabella:
%%sql
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");
Importante
Quando la proprietà della tabella è impostata su true, i comandi INSERISCI, AGGIORNA e UNISCI si comportano come previsto ed eseguono l'ottimizzazione in fase di scrittura. Se la configurazione della sessione V-Order è impostata su true o spark.write la abilita, le scritture saranno V-Order anche se TBLPROPERTIES è impostato su false.
Abilitare o disabilitare V-Order modificando la proprietà della tabella:
%%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");
Dopo aver abilitato o disabilitato V-Order usando le proprietà della tabella, sono interessate solo le scritture future nella tabella. I file Parquet mantengono l'ordinamento usato al momento della creazione. Per modificare la struttura fisica corrente per applicare o rimuovere V-Order, leggere la sezione "Controllare V-Order durante l'ottimizzazione di una tabella" di seguito.
Controllare direttamente V-Order nelle operazioni di scrittura
Tutti i comandi di scrittura di Apache Spark ereditano l'impostazione di sessione, se non esplicita. Tutti i comandi seguenti scrivono usando V-Order, ereditando in modo implicito la configurazione della sessione.
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")
Importante
V-Order si applica solo ai file interessati dal predicato.
In una sessione in cui spark.sql.parquet.vorder.enabled
non è impostato o impostato su false, i comandi seguenti dovrebbero scrivere usando V-Order:
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()
Che cos'è Optimize Write?
I carichi di lavoro analitici nei motori di elaborazione Big Data, come Apache Spark, eseguono prestazioni più efficienti quando si usano dimensioni di file più grandi e standardizzate. La relazione tra le dimensioni del file, il numero di file, il numero di ruoli di lavoro Spark e le relative configurazioni svolge un ruolo fondamentale in ambito prestazionale. L'inserimento di dati in tabelle Data Lake potrebbe avere la caratteristica ereditata di scrivere costantemente molti file di piccole dimensioni; questo scenario è comunemente noto come "problema di file di piccole dimensioni".
Optimize Write è una funzionalità Delta Lake su Microsoft Fabric e Azure Synapse Analytics nel motore Apache Spark che riduce il numero di file scritti e mira ad aumentare le dimensioni dei singoli file di dati scritti. Le dimensioni del file di destinazione possono essere modificate in base ai requisiti del carico di lavoro usando le configurazioni.
La funzionalità è abilitata per impostazione predefinita in Runtime di Microsoft Fabric per Apache Spark. Per ulteriori informazioni sugli scenari di utilizzo di Ottimizza scrittura, si legga l'articolo La necessità di ottimizzare la scrittura in Apache Spark.
Ottimizzazione unione
È ora possibile aggiornare una tabella Delta con condizioni avanzate usando il comando Delta Lake UNISCI. Può aggiornare i dati da una tabella di origine, una vista o un DataFrame in una tabella di destinazione usando il comando UNISCI. Tuttavia, l'algoritmo corrente nella distribuzione open source di Delta Lake non è completamente ottimizzato per la gestione delle righe non modificate. Il team Spark Delta di Microsoft ha implementato un'ottimizzazione personalizzata di Unisci casuale bassa: le righe non modificate vengono escluse da un'operazione costosa di selezione in ordine casuale, necessaria per l'aggiornamento delle righe corrispondenti.
L'implementazione è controllata dalla spark.microsoft.delta.merge.lowShuffle.enabled
configurazione, abilitata per impostazione predefinita nel runtime. Non richiede modifiche al codice ed è completamente compatibile con la distribuzione open source di Delta Lake. Per ulteriori informazioni sugli scenari di utilizzo di Unione casuale bassa, si legga l'articolo Ottimizzazione unione casuale bassa nelle tabelle Delta.
Manutenzione delle tabelle Delta
Man mano che le tabelle Delta cambiano, l'efficienza dei costi di archiviazione e delle prestazioni tende a peggiorare per i motivi seguenti:
- I nuovi dati aggiunti alla tabella potrebbero rendere asimmetrici i dati.
- La velocità di inserimento dei dati in batch e streaming può portare a molti file di piccole dimensioni.
- Le operazioni di aggiornamento ed eliminazione infine creano un sovraccarico di lettura; i file parquet non sono modificabili per impostazione predefinita, quindi le tabelle Delta aggiungono nuovi file parquet con l'insieme di modifiche, amplificando ulteriormente i problemi imposti dai primi due elementi.
- File di dati e file di log non sono più necessari nell'archiviazione.
Per mantenere le tabelle nello stato migliore per ottenere prestazioni ottimali, eseguire operazioni di compattazione bin e svuotamento nelle tabelle Delta. La compattazione bin viene ottenuta dal comando OTTIMIZZA: unisce tutte le modifiche in file parquet più grandi e consolidati. La pulizia dell'archiviazione dereferenziata è ottenuta dal comando SVUOTAMENTO.
I comandi di manutenzione della tabella OTTIMIZZA e SVUOTAMENTO possono essere usati all'interno di notebook e definizioni di processi Spark, quindi orchestrati usando le funzionalità della piattaforma. Lakehouse in Fabric offre una funzionalità che consente di usare l'interfaccia utente per eseguire la manutenzione di tabelle ad hoc, come illustrato nell'articolo Manutenzione delle tabelle Delta Lake.
Importante
La progettazione corretta della struttura fisica della tabella, in base alla frequenza di inserimento e ai modelli di lettura previsti, è probabilmente più importante dell'esecuzione dei comandi di ottimizzazione descritti nella presente sezione.
Controllare V-Order durante l'ottimizzazione di una tabella
Le strutture di comando seguenti eseguono la compattazione bin e riscrivono tutti i file interessati usando V-Order, indipendentemente dall'impostazione TBLPROPERTIES o dall'impostazione di configurazione della sessione:
%%sql
OPTIMIZE <table|fileOrFolderPath> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;
OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER BY (col_name1, col_name2, ...)] VORDER;
quando ZORDER e VORDER vengono usati insieme, Apache Spark esegue la compattazione bin, ZORDER, VORDER in sequenza.
I comandi seguenti eseguono la compattazione bin e riscrivono tutti i file interessati usando l'impostazione TBLPROPERTIES. Se TBLPROPERTIES è impostato su V-Order, tutti i file interessati vengono scritti come V-Order. Se TBLPROPERTIES non è impostato oppure è impostato su false in V-Order, eredita l'impostazione di sessione; pertanto, al fine di rimuovere V-Order dalla tabella, è necessario impostare la configurazione della sessione su false.
%%sql
OPTIMIZE <table|fileOrFolderPath>;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate;
OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];