Condividi tramite


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, ...)];