La necessità di ottimizzare la scrittura in Apache Spark

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. I carichi di lavoro di inserimento in tabelle data lake potrebbero 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 Synapse che riduce il numero di file scritti e mira ad aumentare le dimensioni dei singoli file dei dati scritti. Ottimizza in modo dinamico le partizioni durante la generazione di file con dimensioni predefinite di 128 MB. Le dimensioni del file di destinazione possono essere modificate in base ai requisiti del carico di lavoro usando le configurazioni.

Questa funzionalità consente di ottenere le dimensioni del file usando una fase di riproduzione casuale dei dati aggiuntiva sulle partizioni, causando un costo di elaborazione aggiuntivo durante la scrittura dei dati. La piccola penalità di scrittura deve essere superata dall'efficienza di lettura nelle tabelle.

Nota

  • È disponibile nei pool di Synapse per le versioni di Apache Spark precedenti alla 3.1.

Vantaggi delle scritture ottimizzate

  • È disponibile nelle tabelle Delta Lake per i modelli di scrittura batch e streaming.
  • Non è necessario modificare il spark.write modello di comando. La funzionalità è abilitata da un'impostazione di configurazione o da una proprietà della tabella.
  • Riduce il numero di transazioni di scrittura rispetto al comando OPTIMIZE.
  • Le operazioni OPTIMIZE saranno più veloci perché funzioneranno su un minor numero di file.
  • Anche il comando VACUUM per l'eliminazione dei file non con riferimenti precedenti funzionerà più velocemente.
  • Le query analizzano meno file con dimensioni di file più ottimali, migliorando le prestazioni di lettura o l'utilizzo delle risorse.

Ottimizzare gli scenari di utilizzo della scrittura

Quando usarlo

  • Tabelle partizionate delta lake soggette a modelli di scrittura che generano dimensioni non ottimali (inferiori a 128 MB) o file non standard (file con dimensioni diverse tra se stessi).
  • Frame di dati ripartizionati che verranno scritti su disco con dimensioni non ottimali dei file.
  • Tabelle partizionate delta lake destinate a piccoli comandi SQL batch come UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO e così via.
  • Scenari di inserimento in streaming con modelli di dati di accodamento a tabelle partizionate delta lake in cui la latenza di scrittura aggiuntiva è tollerabile.

Quando evitarlo

  • Tabelle non partizionate.
  • Casi d'uso in cui la latenza di scrittura aggiuntiva non è accettabile.
  • Tabelle di grandi dimensioni con pianificazioni di ottimizzazione ben definite e modelli di lettura.

Come abilitare e disabilitare la funzionalità di scrittura ottimizzata

La funzionalità di scrittura ottimizzata è disabilitata per impostazione predefinita. Nel pool di Spark 3.3 è abilitato per impostazione predefinita per le tabelle partizionate.

Dopo aver impostato la configurazione per il pool o la sessione, tutti i modelli di scrittura Spark useranno la funzionalità .

Per usare la funzionalità di scrittura ottimizzata, abilitarla usando la configurazione seguente:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true

Per controllare il valore di configurazione corrente, usare il comando come illustrato:

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`

Per disabilitare la funzionalità di scrittura ottimizzata, modificare la configurazione seguente, come illustrato di seguito:

  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
  1. Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false

Controllo dell'ottimizzazione della scrittura tramite le proprietà della tabella

Nelle nuove tabelle

  1. SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Uso dell'API DeltaTableBuilder:

val table = DeltaTable.create()
  .tableName("<table_name>")
  .addColumnn("<colName>", <dataType>)
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Nelle tabelle esistenti

  1. SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
  1. Scala

Uso dell'API DeltaTableBuilder

val table = DeltaTable.replace()
  .tableName("<table_name>")
  .location("<table_location>")
  .property("delta.autoOptimize.optimizeWrite", "true") 
  .execute()

Come ottenere e modificare la configurazione delle dimensioni massime correnti del file per Ottimizzare la scrittura

Per ottenere il valore di configurazione corrente, usare i comandi di bellow. Il valore predefinito è 128 MB.

  1. Scala e PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Per modificare il valore di configurazione
  1. Scala e PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Passaggi successivi