Ottimizzazione della tabella Delta Lake e ordine V

Il formato di tabella Lakehouse e Delta Lake sono fondamentali per Microsoft Fabric, assicurando che le tabelle siano ottimizzate per l'analisi è un requisito fondamentale. Questa guida illustra i concetti di ottimizzazione, le configurazioni e le configurazioni della tabella Delta Lake e come applicarli ai modelli di utilizzo di Big Data più comuni.

Che 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, ad esempio Power BI, SQL, Spark e altri.

I motori Power BI e SQL usano la tecnologia Microsoft Verti-Scan e i file parquet ordinati in V per ottenere tempi di accesso ai dati in memoria simili. Spark e altri motori di calcolo non Verti-Scan traggono vantaggio anche dai file ordinati con una media del 10% più veloce, con alcuni scenari fino al 50%.

V-Order funziona applicando speciali ordinazioni, distribuzione di gruppi di righe, codifica del dizionario e compressione su file parquet, richiedendo così meno risorse di rete, disco e CPU nei motori di calcolo per leggerlo, offrendo efficienza dei costi e prestazioni. L'ordinamento V-Order ha un impatto del 15% sui tempi di scrittura medi, ma offre fino al 50% più compressione.

È conforme al formato parquet open source al 100% 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à della tabella e i comandi di ottimizzazione possono essere usati nel controllo V-Order nelle relative partizioni.

L'ordine V viene applicato a livello di file parquet. Le tabelle Delta e le sue caratteristiche, ad esempio Z-Order, compattazione, vuoto, viaggio temporale e così via, sono ortogonali per l'ordine V, come tali, sono compatibili e possono essere usate insieme per vantaggi aggiuntivi.

Controllo delle scritture degli ordini virtuali

L'ordine virtuale è abilitato per impostazione predefinita in Microsoft Fabric e in Apache Spark è controllato dalle configurazioni seguenti.

Impostazione Valore predefinito Descrizione
spark.sql.parquet.vorder.enabled true Controlla la scrittura dell'ordine V a livello di sessione.
TBLPROPERTIES("delta.parquet.vorder.enabled") false Modalità V-Order predefinita nelle tabelle
Opzione writer del dataframe: parquet.vorder.enabled Annullata Controllare le scritture dell'ordine virtuale usando il writer di dataframe

Usare i comandi seguenti per controllare l'utilizzo delle scritture degli ordini virtuali.

Controllare la configurazione dell'ordine virtuale nella sessione di Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled 

Disabilitare la scrittura in ordine virtuale nella sessione di Apache Spark

%%sql 
SET spark.sql.parquet.vorder.enabled=FALSE 

Abilitare la scrittura in ordine virtuale nella sessione di Apache Spark

Importante

Se abilitata a livello di sessione. Tutte le scritture parquet vengono eseguite con L'ordine V abilitato. Sono incluse le tabelle parquet non Delta e le tabelle Delta con la parquet.vorder.enabled proprietà table impostata su true o false.

%%sql 
SET spark.sql.parquet.vorder.enabled=TRUE 

Controllare L'ordine V usando le proprietà della tabella Delta

Abilitare la proprietà 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 IN edizione Standard RT, UPDATE e MERGE 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 da applicare o rimuovere V-Order, leggere la sezione "Control V-Order when optimizing a table" (Controllare l'ordine virtuale durante l'ottimizzazione di una tabella) di seguito.

Controllo diretto dell'ordine virtuale sulle 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

L'ordine V 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 scrivono 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, ad esempio Apache Spark, eseguono prestazioni più efficienti quando si usano dimensioni di file più grandi standardizzate. La relazione tra le dimensioni del file, il numero di file, il numero di ruoli di lavoro Spark e le relative configurazioni, svolgono un ruolo fondamentale sulle prestazioni. 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 in 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 dei 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 Microsoft Fabric Runtime per Apache Spark. Per altre informazioni sugli scenari di utilizzo di scrittura ottimizzati, vedere l'articolo La necessità di ottimizzare la scrittura in Apache Spark.

Ottimizzazione unione

Il comando Delta Lake MERGE consente agli utenti di aggiornare una tabella delta con condizioni avanzate. Può aggiornare i dati da una tabella di origine, una vista o un dataframe in una tabella di destinazione usando il comando MERGE. Tuttavia, l'algoritmo corrente nella distribuzione open source di Delta Lake non è completamente ottimizzato per la gestione delle righe non modificate. Il team di Microsoft Spark Delta ha implementato un'ottimizzazione unione casuale ridotta personalizzata, le righe non modificate vengono escluse da un'operazione di shuffling costosa 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 altre informazioni sugli scenari di utilizzo di unione casuale bassa, vedere 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 inclinare i dati.
  • La velocità di inserimento dei dati in batch e di streaming può portare in molti file di piccole dimensioni.
  • Le operazioni di aggiornamento ed eliminazione alla fine creano un sovraccarico di lettura; I file parquet non sono modificabili per impostazione predefinita, quindi le tabelle Delta aggiungono nuovi file parquet con il set di modifiche, amplificando ulteriormente i problemi imposti dai primi due elementi.
  • File di dati e file di log non più necessari nella risorsa di archiviazione.

Per mantenere le tabelle allo stato migliore per ottenere prestazioni ottimali, eseguire operazioni di compattazione bin e vacuuming nelle tabelle Delta. La compattazione bin viene ottenuta dal comando OPTIMIZE e unisce tutte le modifiche in file Parquet più grandi e consolidati. La pulizia dell'archiviazione dereferenziata viene ottenuta dal comando VACUUM .

I comandi di manutenzione della tabella OPTIMIZE e VACUUM possono essere usati all'interno di notebook e definizioni di processi Spark e 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 sulla 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 in questa sezione.

Controllare l'ordine virtuale durante l'ottimizzazione di una tabella

Le strutture di comando seguenti bin-compact 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 bin-compact e riscrivono tutti i file interessati usando l'impostazione TBLPROPERTIES. Se TBLPROPERTIES è impostato su V-Order, tutti i file interessati vengono scritti come ordine V. Se TBLPROPERTIES è unset o impostato su false su V-Order, eredita l'impostazione di sessione; quindi per rimuovere V-Order dalla tabella, 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, ...)];