Behovet av att optimera skrivning på Apache Spark

Analytiska arbetsbelastningar på stordatabearbetningsmotorer som Apache Spark fungerar mest effektivt när du använder standardiserade större filstorlekar. Relationen mellan filstorleken, antalet filer, antalet Spark-arbetare och dess konfigurationer spelar en viktig roll för prestanda. Inmatningsarbetsbelastningar i datasjötabeller kan ha den ärvda egenskapen att ständigt skriva massor av små filer. det här scenariot kallas ofta för "små filproblem".

Optimera skrivning är en Delta Lake on Synapse-funktion som minskar antalet skrivna filer och syftar till att öka den enskilda filstorleken för de skrivna data. Den optimerar partitioner dynamiskt och genererar filer med en standardstorlek på 128 MB. Målfilens storlek kan ändras enligt arbetsbelastningskraven med hjälp av konfigurationer.

Den här funktionen uppnår filstorleken genom att använda en extra datablandningsfas över partitioner, vilket orsakar en extra bearbetningskostnad när du skriver data. Den lilla skrivstraffet bör uppvägas av läseffektivitet på tabellerna.

Kommentar

  • Den finns i Synapse-pooler för Apache Spark-versioner ovan 3.1.

Fördelar med optimera skrivningar

  • Den är tillgänglig i Delta Lake-tabeller för både Batch- och Streaming-skrivmönster.
  • Du behöver inte ändra spark.write kommandomönstret. Funktionen aktiveras av en konfigurationsinställning eller en tabellegenskap.
  • Det minskar antalet skrivtransaktioner jämfört med kommandot OPTIMIZE.
  • OPTIMERA åtgärder kommer att gå snabbare eftersom det fungerar på färre filer.
  • VACUUM-kommandot för borttagning av gamla orefererade filer fungerar också snabbare.
  • Frågor söker igenom färre filer med mer optimala filstorlekar, vilket förbättrar läsprestanda eller resursanvändning.

Optimera scenarier för skrivanvändning

När du ska använda detta

  • Delta Lake-partitionerade tabeller som omfattas av skrivmönster som genererar suboptimala (mindre än 128 MB) eller icke-standardiserade filstorlekar (filer med olika storlekar mellan sig).
  • Ompartitionerade dataramar som kommer att skrivas till disk med suboptimal filstorlek.
  • Delta Lake-partitionerade tabeller som riktas mot små SQL-kommandon i batchen, till exempel UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO osv.
  • Scenarier för strömmande inmatning med tilläggsdatamönster i partitionerade Delta lake-tabeller där den extra skrivfördröjningen kan tolereras.

När du ska undvika det

  • Icke-partitionerade tabeller.
  • Använd fall där extra skrivfördröjning inte är acceptabelt.
  • Stora tabeller med väldefinierade optimeringsscheman och läsmönster.

Så här aktiverar och inaktiverar du funktionen för att optimera skrivning

Funktionen optimera skrivning är inaktiverad som standard. I Spark 3.3-pool är den aktiverad som standard för partitionerade tabeller.

När konfigurationen har angetts för poolen eller sessionen använder alla Spark-skrivmönster funktionerna.

Om du vill använda funktionen optimera skrivning aktiverar du den med hjälp av följande konfiguration:

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

Om du vill kontrollera det aktuella konfigurationsvärdet använder du kommandot enligt nedan:

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

Om du vill inaktivera funktionen optimera skrivning ändrar du följande konfiguration enligt nedan:

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

Styra optimera skrivning med tabellegenskaper

På nya tabeller

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

Använda DeltaTableBuilder-API:et:

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

I befintliga tabeller

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

Använda DeltaTableBuilder-API:et

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

Så här hämtar du och ändrar den aktuella maximala filstorlekskonfigurationen för Optimera skrivning

Om du vill hämta det aktuella konfigurationsvärdet använder du bälgkommandona. Standardvärdet är 128 MB.

  1. Scala och PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
  • Ändra konfigurationsvärdet
  1. Scala och PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
  1. SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728

Nästa steg